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.