Todd Gayley a mentionné un jour que LibraryLoad
est pour le pré-chargement des bibliothèques dépendantes dont vous avez besoin. Ainsi, par exemple, si vous écrivez une fonction qui nécessite une bibliothèque numérique, vous pouvez la charger avant d'appeler les fonctions de votre bibliothèque.
Vous n'avez pas besoin de précharger la bibliothèque WolframLibrary que vous avez développé parce que vous le chargez implicitement en chargeant les fonctions qu'il contient.
Par conséquent, je pense que la solution à votre problème est que vous devez appeler LibraryFunctionLoad
sur une des fonctions que vous développez et ensuite LibraryUnload
devrait fonctionner comme prévu.
De plus, vous devez décharger toutes les fonctions avec LibraryFunctionUnload
avant de décharger la bibliothèque.
(Informations à partager pour les utilisateurs de Windows malgré la balise linux dans la question d'origine.)
Comme ce commentaire l'a mentionné, il existe un problème supplémentaire sur la plate-forme Windows, que je vais essayer de décrire ici, à condition qu'il y ait une solution.
Le LibraryUnload
problème d'échec sous Windows
Supposons que l'on ait une bibliothèque "autonome" myLib.dll , qui n'a rien à voir avec Mathematica ou LibraryLink. Ensuite, on a un libLink.dll , qui utilise myLib et fournit des fonctions à Mathematica via LibraryLink.
En tant que libLink dépend de myLib , on peut essayer de pré-charger myLib avant de charger libLink , et cela fonctionne sans problème :
LibraryLoad["myLib.dll"]
myfunc = LibraryFunctionLoad["libLink.dll", ... ]
Mais alors, sous Windows, si on essaie de les décharger avec
LibraryUnload["libLink.dll"]
LibraryUnload["myLib.dll"]
Le premier réussira mais le second échouera avec un message d'erreur
LibraryFunction::unloadlib: The library myLib.dll cannot be unloaded.
En utilisant des outils tels que Process Explorer, on peut voir que le descripteur du fichier n'a pas été publié par le noyau.
La solution
Le problème décrit peut être frustrant lorsque l'on développe myLib . Il faut tuer le noyau à chaque fois avant de recompiler myLib . La solution, qui a été trouvée et gentiment partagée par ilian (qui a très généreusement revu mon code et s'est penché sur le problème.), est
NE PAS précharger manuellement myLib avec LibraryLoad
à la première place.
Au lieu de cela, on peut modifier l'environnement du système d'exploitation afin que Windows puisse trouver toutes les bibliothèques dépendantes et les gérer automatiquement :
SetEnvironment["PATH" -> Environment["PATH"] <> ";" <> "path_to_folder_of_myLib.dll"]
myfunc = LibraryFunctionLoad["libLink.dll", ... ]
Le déchargement sera désormais aussi simple que :
LibraryUnload["libLink.dll"]
Après cela, s'il n'y a pas d'autre référence à myLib.dll , il sera modifiable.