9 votes

Interopérabilité avec les bibliothèques natives sous linux

J'écris une application en C#, qui est multiplateforme. Elle utilise DllImport pour plusieurs bibliothèques différentes. Il est aussi à la fois x32 et x64. Il semble fonctionner correctement pour mes propres .dll/.so compilés. J'ai placé les bibliothèques partagées x32 dans le sous-dossier x32, et les bibliothèques partagées x64 dans le sous-dossier x64.

Sous Windows, via .net framework, j'appelle SetDllDirectory("x32" or "x64") en fonction du courant courant. Sur mono, que ce soit sous Windows, linux ou mac, j'utilise un fichier DllMap dans RandomLibrary.dll.config. Cela fonctionne bien pour les fichiers situés dans les répertoires x32 ou x64.

Cependant, j'utilise aussi DllImport pour des bibliothèques que je n'ai pas écrites, comme FreeType2. Sous Windows, je place simplement les bibliothèques construites dans les deux sous-dossiers. Cependant, sous linux, je préfère utiliser la bibliothèque libfreetype6 que vous pouvez installer via votre sympathique gestionnaire de paquets local. Je peux coder en dur le lien DllMap à /usr/lib/x86_64-linux-gnu/libfreetype .so.6, mais je suppose que le fichier freetype change en fonction de la distro que vous utilisez.

Existe-t-il un moyen simple de trouver libfreetype.so quelle que soit la distribution que j'utilise ?

3voto

lupus Points 2955

L'utilisation de DllImport("libfreetype.so.6") pour Linux devrait suffire, car le système devrait être configuré pour le gérer correctement. Vérifiez que vous avez installé les paquets corrects. Si cela ne fonctionne pas, il se peut que votre système soit mal configuré : indiquez les erreurs que vous obtenez, la valeur de la variable d'environnement LD_LIBRARY_PATH, le contenu de /etc/ld.so.conf et les fichiers dans /etc/ld.so.conf.d/. La sortie de

/sbin/ldconfig -p |grep freetype

serait également utile.

2voto

IanNorton Points 3797

Mono a une chose/procédure spécifique pour cela, elle s'appelle DllMap . Vous pouvez spécifier quelle libaray non gérée est chargée sur quelle plate-forme. Par exemple :

<configuration>
    <dllmap dll="foobar" os="linux" wordsize="64" target="linux/amd64/libfoobar.so" />
    <dllmap dll="foobar" os="linux" wordsize="32" target="linux/i386/libfoobar.so" />
</configuration>

Je n'ai pas essayé ce qui précède moi-même - La documentation de dllmap semble indiquer que la valeur cible n'est pas un chemin, mais je ne peux pas en être sûr.

Une autre approche serait d'avoir un simple shellscript ou un fichier batch. Sous linux, le shell script pourrait facilement déterminer l'architecture en appelant arch et mettre LD_LIBRARY_PATH en conséquence. Je préfère généralement une enveloppe shell autour de mes programmes mono ( cf. MyProgram.exe sur la console, c'est moche)

Enfin, vous pourriez avoir plus amusant si tu pinces dans dlopen o LoadLibarary pour précharger vos bibliothèques partagées.

Lorsque votre application gérée démarre, vous décidez de l'architecture que vous êtes et vous utilisez ensuite dlopen() si vous êtes sous linux ou LoadLibaray() si vous êtes sous Windows.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X