Pages : 1
#1 Le 21/02/2007, à 11:31
- CasseTaTele
Compilation bibliothèque dynamique
Bonjour,
je dois compiler une librairie dynamique libA.so à partir de 4 fichier en C.
Jusque là tout va bien je compile chaque fichier pour obtenir des objets (.o) avec la commande :
gcc -c -fPIC fichier.c
puis je crée la librairie dynamique avec cette commande :
gcc-4.1 -shared -Wl,-soname,libA.so -o libA.so *.o
Seulement cette librairie fait appel à des fonctions d'une autre librairie dynamique libcvox.so, et lorsque mon programme java charge la librairie libA.so j'obtiens l'erreur suivante :
Exception in thread "main" java.lang.UnsatisfiedLinkError: libA.so: libA.so: undefined symbol: cvox_DeleteEngine
Je rajoute donc la librairie 'libcvox' lors de l'édition de liens :
gcc-4.1 -L/usr/local/lib/ -shared -Wl,-soname,libAgentSynthese.so -o libAgentSynthese.so *.o libcvox.so
Mais maintenant j'ai cette erreur :
Exception in thread "main" java.lang.UnsatisfiedLinkError: libA.so: libcvox.so: symbol errno, version GLIBC_2.0 not defined in file libc.so.6 with link time reference
Voici ce que me donne ldd sur ces librairies:
ldd libA.so
linux-gate.so.1 => (0xffffe000)
PIC => not found
libcvox.so => /media/doris/georal/REPAIMTA/georal-06-08/ressources-lib/libcvox.so (0xb7deb000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7ca7000)
libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb7c80000)
librt.so.1 => /lib/tls/i686/cmov/librt.so.1 (0xb7c77000)
libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7c73000)
/lib/ld-linux.so.2 (0x80000000)
libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb7c60000)
ldd libcvox.so
linux-gate.so.1 => (0xffffe000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7d13000)
libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb7ced000)
librt.so.1 => /lib/tls/i686/cmov/librt.so.1 (0xb7ce3000)
libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7cdf000)
/lib/ld-linux.so.2 (0x80000000)
libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb7ccc000)
A votre avis, est-ce que mon édition de liens est mal faite lors de la création de libA.so ou est-ce que le problème vient de libcvox.so ?
Hors ligne
#2 Le 21/02/2007, à 15:49
- CasseTaTele
Re : Compilation bibliothèque dynamique
Sur cette page http://www.novell.com/coolsolutions/feature/11775.html, j'ai vu ça :
./a.out: relocation error: ./a.out: symbol errno, version GLIBC_2.0 not defined in file libc.so.6 with link time reference
If you happen to see the above error message about the symbol errno, your program has been linked with a version of glibc older than 2.3. Newer versions of glibc no longer provide errno as a global variable to allow its thread-safe usage. In this situation, you would have to set up a compatibility environment with an older version of glibc, such as version 2.2.5.
il semblerait que la librairie libcvox.so ait besoin d'une version de glibc plus ancienne (j'ai la version 2.4). Où se procurer cette librairie et comment l'utiliser ?
Hors ligne
#3 Le 21/02/2007, à 17:33
- oce
Re : Compilation bibliothèque dynamique
Normalement, tu ne devrais pas avoir besoin de lier tes autres librairies si tu crée une librairie partagée.
essaie avec
-shared -fPic
dans ta procédure de link.
Sur quelle type de machine es-tu? Je me souviens avoir eu ce problème en compilant sur une 64 bits
Hors ligne
#4 Le 22/02/2007, à 10:40
- CasseTaTele
Re : Compilation bibliothèque dynamique
Merci de ton aide !
j'ai un processeur :
AMD Sempron(tm) Processor 3000+
c'est un 32 bits non ? (Un truc étrange : dans le gestionnaire de périphérique: le processeur n'est pas reconnu (dans les infos du device processor), et il y a 4 catégories de device k8 [Athlon64/Opteron] (DRAM controller ,... ) )
j'ai essayé avec l'option -shared -fPIC :
gcc -shared -fPIC -Wl,-soname,libA.so -o libA.so *.o
mais je retombe sur le premier problème :
Exception in thread "main" java.lang.UnsatisfiedLinkError: libA.so: libA.so: undefined symbol: cvox_DeleteEngine
Apparamment il ne trouve pas les fonctions de la librairie libcvox.so ...
C'est pas une question de répertoire car j'ai essayé de copier cette librairie dans /lib/ et ça produit la meme erreur.
Le bout de code java qui plante est le suivant :
System.out.println("loading de libA.so");
System.load("libA.so");
Normalement, faut-il charger libcvox.so avant de charger libA.so ?
j'ai essayé de commencer par charger libcvox.so mais dans ce cas je tombe sur l'erreur "symbol errno, version GLIBC_2.0 not defined in file libc.so.6 with link time reference" au moment du chargement de libcvox.so ...
Hors ligne