GNU/Linux >> Tutoriels Linux >  >> Linux

LibraryUnload échoue

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.


Linux
  1. Mon kit de survie d'administrateur système Linux

  2. Avez-vous déjà racké un serveur ?

  3. Exécuter une ligne de commandes avec One Sudo ?

  4. Façon de synchroniser une seule partition ?

  5. La redirection vers un nom de fichier global échoue ?

[Bash Tips] Comment cd et ls en une seule commande

[Bash Tips] Comment cp ou mv et cd en une seule commande

Vsftpd échoue l'authentification Pam ?

Rechercher -exec + Vs Rechercher | Xargs :lequel choisir ?

poignée de processus dans lldbinit

IP de l'hôte local