GNU/Linux >> Linux Esercitazione >  >> Linux

LibraryUnload non riesce

Todd Gayley una volta menzionò quel LibraryLoad è per il pre-caricamento delle librerie depend di cui hai bisogno. Quindi, ad esempio, se scrivi una funzione che necessita di una libreria numerica, puoi caricarla prima di chiamare le funzioni nella tua libreria.

Non è necessario precaricare la libreria WolframLibrary hai sviluppato perché lo carichi implicitamente caricando le funzioni al suo interno.

Pertanto, credo che la soluzione al tuo problema sia che devi chiamare LibraryFunctionLoad su una delle funzioni che stai sviluppando e dopo LibraryUnload dovrebbe funzionare come previsto.

Inoltre, dovresti scaricare tutte le funzioni con LibraryFunctionUnload prima di scaricare la libreria.


(Informazioni che vale la pena condividere per gli utenti Windows nonostante il tag linux nella domanda originale.)

Come accennato in questo commento, c'è un problema aggiuntivo sulla piattaforma Windows, che cercherò di descrivere qui, a patto di trovare una soluzione.

Il LibraryUnload problema di errore su Windows

Supponiamo che uno abbia una libreria "autonoma" myLib.dll , che non ha nulla a che fare con Mathematica o LibraryLink. Quindi uno ha un libLink.dll , che utilizza myLib e fornisce funzioni a Mathematica tramite LibraryLink.

Come libLink dipende da myLib , si può provare a precaricare myLib prima di caricare libLink e funziona senza problemi:

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

Ma poi, su Windows, se si prova a scaricarli con

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

Il primo avrà successo ma il secondo fallirà con un messaggio di errore

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

Usando strumenti come Process Explorer si può vedere che l'handle del file non è stato rilasciato dal kernel.

La soluzione

Il problema descritto può essere frustrante quando si sta sviluppando myLib . Bisogna terminare il kernel ogni volta prima di ricompilare myLib . La soluzione, che è stata trovata e gentilmente condivisa da ilian (che ha rivisto molto generosamente il mio codice e ha esaminato il problema), è

NON precaricare manualmente myLib con LibraryLoad al primo posto.

Invece, si può modificare l'ambiente del sistema operativo in modo che Windows possa trovare tutte le librerie dipendenti e gestirle automaticamente:

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

Scaricare ora sarà semplice come:

LibraryUnload["libLink.dll"]

Dopodiché, se non ci sono altri riferimenti a myLib.dll , sarà modificabile.


Linux
  1. Vsftpd non riesce ad autenticare Pam?

  2. Eseguire una linea di comandi con un sudo?

  3. Rompere la ricerca se un -exec fallisce?

  4. Processo in background in Linux

  5. Trovare il contenuto di un file in un altro file

[Suggerimenti Bash] Come fare cd e ls in un comando

[Suggerimenti Bash] Come cp o mv e cd in un comando

Trova -exec + Vs Trova | Xargs:quale scegliere?

Il reindirizzamento a un nome di file Globbed non riesce?

Cosa succede se mv viene interrotto?

s3cmd fallisce troppe volte