Question

Je travaille sur une application X11 ordinaire.

Par défaut, mon application ne nécessite que libX11.so et les libs gcc standard C et mathématiques. L'application peut étendre les fonctionnalités avec système de son Xfixes, Xrender et ALSA. Cependant, ceux-ci (Xfixes, Xrender et ALSA) fonction sont facultatifs.

Pour ce comportement, j'utilise le chargement de temps d'exécution à savoir, libxfixes, libxrender et libasound est dlopen ed ().

D'où l'application peut fonctionner en l'absence de ces bibliothèques.

Ma question:

What library names should I use when calling dlopen()?  

J'ai observé que ceux-ci diffèrent de distro à distro.
Par exemple, sur openSUSE 11, ils sont nommés comme suit:

  • libXfixes.so
  • libXrender.so
  • libasound.so

Sur Ubuntu, cependant, les noms ont un numéro de version ci-jointe, comme ceci:

  • libXfixes.so.3
  • libXrender.so.1
  • libasound.so.2

Alors essayez d'ouvrir « libXfixes.so » échouerait Ubuntu, bien que la lib est évidemment là. Il a juste un numéro de version ci-jointe. Alors comment mon application gérer cela?
Dois-je laisser mon application scan / usr / lib / manuellement pour voir d'abord que nous avons libs puis choisir un approprié? Ou est-ce que quelqu'un a une meilleure idée?

Merci les gars,

Andy

Était-ce utile?

La solution

Vous devez dlopen à l'aide de SONAME de la bibliothèque. Vous pouvez voir qu'en utilisant readelf -d [libname].

Par exemple, sur une de mes machines Linux Fedora la SONAME de la bibliothèque C est libc.so.6.

Les liens symboliques des noms .so aux noms de .so.6 ne sont pas garantis. Ces liens symboliques ne sont nécessaires que pour la compilation de logiciels et ne sont généralement pas installés sur les systèmes sans les packages de développement.

Vous ne voudriez pas finir par charger une version avec un numéro différent de toute façon, parce que les changements de numéro indiquent les différences importantes de l'API.

Autres conseils

D'après ce que j'ai appris, que vous venez dlopen() (par exemple) « libXfixes.so », ce qui est très probablement un lien symbolique vers le fichier le plus récent « libXfixes.so.3 » de toute façon, d'une manière similaire à celle-ci:

$ file /usr/lib/libalpm.so
/usr/lib/libalpm.so: symbolic link to `libalpm.so.4.0.3'

Un aperçu rapide de mes spectacles, que presque toutes les bibliothèques « / usr / lib / » là-bas est un lien symbolique à son fichier le plus récent numéro « .X », et je suis sûr que ce comment faire sur d'autres distribtuions aussi.

Seulement si vous avez besoin d'une version spécifique de la bibliothèque, vous nommez explicitement la version « libXfixes.so.2 » par exemple.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top