Todd Gayley hat einmal diesen LibraryLoad
erwähnt dient zum Vorladen von abhängigen Bibliotheken, die Sie benötigen. Wenn Sie beispielsweise eine Funktion schreiben, die eine numerische Bibliothek benötigt, können Sie diese laden, bevor Sie die Funktionen in Ihrer Bibliothek aufrufen.
Sie müssen die WolframLibrary-Bibliothek nicht vorab laden Sie haben entwickelt, weil Sie es implizit laden, indem Sie die darin enthaltenen Funktionen laden.
Daher glaube ich, dass die Lösung für Ihr Problem darin besteht, dass Sie LibraryFunctionLoad
anrufen müssen auf eine der Funktionen, die Sie entwickeln und danach LibraryUnload
sollte wie erwartet funktionieren.
Außerdem sollten Sie alle Funktionen mit LibraryFunctionUnload
entladen vor dem Entladen der Bibliothek.
(Informationen, die trotz des Linux-Tags in der ursprünglichen Frage für Windows-Benutzer geteilt werden sollten.)
Wie in diesem Kommentar erwähnt, gibt es ein zusätzliches Problem auf der Windows-Plattform, das ich hier zu beschreiben versuchen werde, solange es eine Lösung dafür gibt.
Die LibraryUnload
Fehlerproblem unter Windows
Angenommen, man hat eine "eigenständige" Bibliothek myLib.dll , was nichts mit Mathematica oder LibraryLink zu tun hat. Dann hat man eine libLink.dll , die myLib verwendet und bietet Funktionen für Mathematica über LibraryLink.
Als libLink hängt von myLib ab , kann man versuchen, myLib vorab zu laden vor dem Laden von libLink , und es funktioniert ohne Probleme:
LibraryLoad["myLib.dll"]
myfunc = LibraryFunctionLoad["libLink.dll", ... ]
Aber dann, unter Windows, wenn man versucht, sie mit
zu entladenLibraryUnload["libLink.dll"]
LibraryUnload["myLib.dll"]
Ersteres wird erfolgreich sein, aber letzteres wird mit einer Fehlermeldung fehlschlagen
LibraryFunction::unloadlib: The library myLib.dll cannot be unloaded.
Mit Tools wie dem Process Explorer kann man sehen, dass das Handle der Datei nicht vom Kernel freigegeben wurde.
Die Lösung
Das beschriebene Problem kann frustrierend sein, wenn man myLib entwickelt . Man muss den Kernel jedes Mal beenden, bevor man myLib neu kompiliert . Die Lösung, die gefunden und mir freundlicherweise von ilian mitgeteilt wurde (der meinen Code sehr großzügig überprüft und sich mit dem Problem beschäftigt hat), ist
NICHT zum manuellen Vorabladen von myLib mit LibraryLoad
auf dem ersten Platz.
Stattdessen kann man die Betriebssystemumgebung ändern, damit Windows alle abhängigen Bibliotheken finden und automatisch verwalten kann:
SetEnvironment["PATH" -> Environment["PATH"] <> ";" <> "path_to_folder_of_myLib.dll"]
myfunc = LibraryFunctionLoad["libLink.dll", ... ]
Das Entladen ist jetzt so einfach wie:
LibraryUnload["libLink.dll"]
Danach, wenn kein anderer Verweis auf myLib.dll vorhanden ist , es kann bearbeitet werden.