GNU/Linux >> Znalost Linux >  >> Linux

LibraryUnload se nezdaří

Todd Gayley jednou zmínil, že LibraryLoad je pro předběžné načítání závislých knihoven, které potřebujete. Pokud tedy například píšete funkci, která potřebuje nějakou numerickou knihovnu, můžete ji načíst před voláním funkcí ve vaší knihovně.

Není třeba předem načítat knihovnu WolframLibrary jste vyvinuli, protože jej implicitně načtete načtením funkcí v něm.

Proto se domnívám, že řešením vašeho problému je, že musíte zavolat LibraryFunctionLoad na jedné z funkcí, které vyvíjíte, a poté na LibraryUnload by mělo fungovat podle očekávání.

Kromě toho byste měli uvolnit všechny funkce pomocí LibraryFunctionUnload před vyložením knihovny.


(Informace, které stojí za to sdílet pro uživatele Windows navzdory linuxové značce v původní otázce.)

Jak již bylo zmíněno v tomto komentáři, na platformě Windows existuje další problém, který se zde pokusím popsat, pokud jde o jeho řešení.

LibraryUnload problém selhání v systému Windows

Předpokládejme, že jeden má „samostatnou“ knihovnu myLib.dll , který nemá nic společného s Mathematica nebo LibraryLink. Pak máte soubor libLink.dll , který používá myLib a poskytuje funkce Mathematica prostřednictvím LibraryLink.

Jako libLink závisí na myLib , můžete zkusit přednačíst myLib před načtením libLink a funguje to bez problémů:

LibraryLoad["myLib.dll"]
myfunc = LibraryFunctionLoad["libLink.dll", ... ]

Ale pak, ve Windows, pokud se je někdo pokusí uvolnit pomocí

LibraryUnload["libLink.dll"]
LibraryUnload["myLib.dll"]

První bude úspěšný, ale druhý selže s chybovou zprávou

LibraryFunction::unloadlib: The library myLib.dll cannot be unloaded.

Pomocí nástrojů, jako je Process Explorer, můžete vidět, že jádro souboru neuvolnilo popisovač.

Řešení

Popsaný problém může být frustrující, když člověk vyvíjí myLib . Před opětovnou kompilací myLib je nutné pokaždé zabít jádro . Řešení, které našel a laskavě mi sdílel ilian (který velmi velkoryse zkontroloval můj kód a prozkoumal problém.), je

NENÍ ručně předem načítat myLib s LibraryLoad na prvním místě.

Místo toho lze upravit prostředí operačního systému tak, aby systém Windows mohl najít všechny závislé knihovny a automaticky je spravovat:

SetEnvironment["PATH" -> Environment["PATH"] <> ";" <> "path_to_folder_of_myLib.dll"]
myfunc = LibraryFunctionLoad["libLink.dll", ... ]

Vykládání bude nyní stejně jednoduché jako:

LibraryUnload["libLink.dll"]

Poté, pokud neexistuje žádný další odkaz na myLib.dll , bude možné jej upravit.


Linux
  1. Moje sada pro přežití Linux sysadmin

  2. Už jste někdy nabourali server?

  3. Vsftpd selže při ověřování Pam?

  1. Jak synchronizovat pouze jeden oddíl?

  2. Selhalo přesměrování na název souboru Globbed?

  3. Vymanit se z hledání, pokud selže -exec?

  1. Co se stane, když je mv přerušeno?

  2. s3cmd selže příliš mnohokrát

  3. Jak deaktivovat jeden CPU