2013-06-11 2 views
0

Je me sers d'une bibliothèque d'enregistrement, nommé liblogger, (que j'ai mis en place) dans une autre bibliothèque, libmsg. Pour les deux, j'utilise les autotools. J'ai réussi à installer la bibliothèque liblogger dans mon système, dans le répertoire/usr/local/lib.configure trouve la bibliothèque, mais ldd ne

Dans le script configure.ac de l'autre libmsg, je vérifier que liblogger est installé dans le système, comme suit:

AC_CHECK_LIB([logger], 
      [log_init], 
      [], 
      [ 
       echo "Error: Could not find liblogger." 
       exit 1 
      ]) 

et ajoutez le "-L/usr/local/lib" chemin vers la variable LDFLAGS.

Le test AC_CHECK_LIB trouve la bibliothèque et la bibliothèque libmsg et ses check_PROGRAMS sont compilés avec succès.

Cependant, lorsque je tente d'exécuter les programmes de test, je reçois l'erreur:

error while loading shared libraries: liblogger.so.0: cannot open shared object file: No such file or directory

En effet, ldd ne trouve pas la bibliothèque soit:

$ ldd msgs 
    linux-vdso.so.1 => (0x00007fff543ff000) 
    liblogger.so.0 => not found 
    libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007fdf329ad000) 

Mais la bibliothèque est effectivement là, dans /usr/local/lib.

Pour relier le programme de test, libtool est appelé à l'instruction:

$ /bin/bash ../libtool --tag=CC --mode=link gcc -I../include -I../msg -L/usr/local/lib -O2 -Wall -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/local/include -I/usr/local/lib -L/usr/local/lib -o msgs msgs.o message.o base64.o misc.o -llogger -lglib-2.0 

qui fait écho à fait ce qui suit:

libtool: link: gcc -I../include -I../msg -O2 -Wall -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/local/include -I/usr/local/lib -o msgs msgs.o message.o base64.o misc.o -L/usr/local/lib /usr/local/lib/liblogger.so -lglib-2.0 

Ainsi, le drapeau -llogger est remplacé par -L [..] /usr/local/liblogger.so (je suppose que c'est un comportement correct? Je ne l'ai pas encore été en mesure de le déterminer ...)

En fait, si je l'appelle le programme de test avec:

LDPRELOAD=/usr/local/lib/liblogger.so msgs

Il fonctionne réellement. Est-ce que quelqu'un peut me dire ce que c'est que ce qui me manque?

Répondre

2

Vous devez vérifier si:

  • /usr/local/lib est en /etc/ld.so.conf (il est généralement ces jours-ci). A été exécuté lorsque vous avez installé liblogger. Sinon, lancez-le.
  • liblogger.so.0 est actuellement en /usr/local/lib.
+0

'ldconfig' n'était pas en cours d'exécution. Cela a résolu le problème, merci. Existe-t-il un moyen de faire exécuter libtool automatiquement? – Ginswich

+1

'libtool' ne devrait pas exécuter' ldconfig'. Même 'make install' dit d'exécuter' ldconfig' après, au lieu de l'exécuter lui-même. Habituellement, le gestionnaire de paquets (RPM, apt, etc.) l'exécute car il n'a vraiment besoin d'être exécuté que la première fois que la lib est installée (et après la désinstallation). En cours d'exécution 'ldconfig', il nécessite également des privilèges root. – ldav1s

Questions connexes