Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 21/02/2007, à 12: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, à 16: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, à 18: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, à 11: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