GNU/Linux >> LINUX-Kenntnisse >  >> Linux

LibraryUnload schlägt fehl

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 entladen
LibraryUnload["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.


Linux
  1. Mein Linux-Sysadmin-Survival-Kit

  2. Haben Sie schon einmal einen Server geracked?

  3. Möglichkeit, nur eine Partition zu synchronisieren?

  4. Suchen -exec + Vs Finden | Xargs:Welche soll man wählen?

  5. Brechen Sie von Find ab, wenn ein -exec fehlschlägt?

[Bash-Tipps] How To cd und ls in einem Befehl

[Bash-Tipps] Wie cp oder mv und cd in einem Befehl ausgeführt werden

Was passiert, wenn mv unterbrochen wird?

IP des lokalen Hosts

So deaktivieren Sie eine CPU

Schwanz- und Platzhalterzeichen