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.