Compiler avec une librairie partagée

sabrina -  
mamiemando Messages postés 33769 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

Dans mon répertoire /home/travail j'ai ceci:

file.c file.o libmyfile.so main.c

je souhaite compiler mon main.c avec la librairie partagée mais rien n'y fait, voici le résultat:

gcc main.c -lmyfile.so
/usr/bin/ld: cannot find -lmyfile.so
collect2: ld a retourné 1 code d'état d'exécution

Voici quelques infos si ça peut vous aider:

echo $LD_LIBRARY_PATH
/usr/local/bin

Meme avec ldconfig je n'ai aucun résultat, quelqu'un aurait il une idée?
merci

9 réponses

mamiemando Messages postés 33769 Date d'inscription   Statut Modérateur Dernière intervention   7 878
 
Il faudrait nous indiquer où est positionné libmyfile.so.

Si c'est dans /usr/local/lib, /usr/lib ou /lib tu peux directement ajouter l'option -lmyfile.
Si c'est un autre répertoire il faut passer des options à gcc pour explorer d'autres répertoires que les trois dossiers par défaut que je t'ai listé.

De la même manière que l'option -I (ou -isystem) permet d'enrichir la liste des dossiers dans lesquels gcc va chercher des headers (fichiers .h) sont si je ne me trompe pas :
-L enrichit la liste des répertoires dans lesquels il cherche des ".a"
-Wl,-R enrichit la liste des répertoires dans lesquels il cherche des ".so"

Ainsi, si le fichier s'appelle /home/toto/libmyfile.so, je pense que ta ligne de compilation devient la suivante :

gcc -Wl,-R /home/toto main.c file.o -lmyfile


Bonne chance
0
sabrina
 
alors voici ce que j'obtiens:

ls
file.c  file.o  libmyfile.so  main.c


ls /usr/local/bin
libmyfile.so


 gcc main.c -lmyfile
/usr/bin/ld: cannot find -lmyfile
collect2: ld a retourné 1 code d'état d'exécution


gcc -Wl,R/home/sabrina/travail  main.c -lmyfile
/usr/bin/ld: cannot find R/home/sabrina/travail: No such file or directory
/usr/bin/ld: cannot find -lmyfile
collect2: ld a retourné 1 code d'état d'exécution


et finalement ça a marché avec cette ligne que j'ai tapé un peu comme une lib statique finalement:

 gcc -L /home/sabrina/travail main.c -lmyfile


Je n'ai pas du compiler le file.c car je l'avais compilé pour créer la lib dynamique, c'est normal je suppose?
0
mamiemando Messages postés 33769 Date d'inscription   Statut Modérateur Dernière intervention   7 878
 
Pour commencer ça m'étonne que ça marche avec -L (puisqu'il ne s'agit pas d'un .a) au lieu de -Wl,-R (puisqu'il s'agit d'un .so). Au passage, j'avais oublié un tiret dans mon message précédent (corrigé depuis).

Si main.c fait appel à des fonctions implémentées dans file.c (et donc dont le code machine est dans file.o) je ne vois pas comment ça peut marcher sans linker avec file.o à moins bien sur que file.o soit utilisé pour générer (et donc contenu dans) libmyfile.so.

Ensuite, je ne comprends pas trop pourquoi tu mets ta librairie dans /usr/local/bin (alors que ce serait plutôt /usr/local/lib) pour compiler. Mais bon, si tu décides de la mettre dans ce dossier, alors je dirais que pour compiler il faut lancer :

cd /home/sabrina/travail   
gcc -c file.c   
gcc -Wl,-R /usr/local/bin main.c file.o -lmyfile


(si file.o est utilisé pour compiler libmyfile.so, omet file.o dans la dernière ligne, si tu auras de multiples définitions de ses fonctions au moment de linker).

Bonne chance
0
sabrina
 
merci, cela marche aussi avec ta ligne de commande.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mamiemando Messages postés 33769 Date d'inscription   Statut Modérateur Dernière intervention   7 878
 
Parfait bonne continuation !
0
sabrina
 
Salut mamiemando, en fait non rien n'est résolu, là je suis sur un pc où je ne suis pas root, et j'utilise tcsh, mais c'est censé marcher, voici ce que j'ai:

ls
file.c  file.o  libmy.so  main.c


gcc -Wl,-R /home/sabrina/travail main.c file.o -lmy
/usr/lib64/gcc/x86_64-suse-linux/4.6/../../../../x86_64-suse-linux/bin/ld: cannot find -lmy
collect2: ld returned 1 exit status


Première erreur, donc je fais ça:

gcc -L /home/sabrina/travail main.c file.o -lmy


ça marche, ensuite je fais ceci:

setenv LD_LIBRARY_PATH /home/sabrina/travail

et finalement:

./a.out
./a.out: error while loading shared libraries: libmy.so: cannot open shared object file: No such file or directory


Aurais tu une idée à tout hasard car je fouille tous les tutos mais rien ne marche...

merci.
0
mamiemando Messages postés 33769 Date d'inscription   Statut Modérateur Dernière intervention   7 878
 
gcc -Wl,-R /home/sabrina/travail main.c file.o -lmy
/usr/lib64/gcc/x86_64-suse-linux/4.6/../../../../x86_64-suse-linux/bin/ld: cannot find -lmy
collect2: ld returned 1 exit status


Ben là il te dit qu'il n'arrive pas à linker avec libmy.so (je croyais que c'était libmyfile.so, donc ça ne devrait pas être -lmyfile ?).


Première erreur, donc je fais ça:

gcc -L /home/sabrina/travail main.c file.o -lmy


Ah donc maintenant c'est /home/sabrina/travail/libmy.so je suppose ?

./a.out
./a.out: error while loading shared libraries: libmy.so: cannot open shared object file: No such file or directory


Donc là effectivement il ne trouve pas ta librairie. Vu qu'elle n'est pas dans un répertoire standard et vu que tu n'as pas les droits pour écrire dans un tel répertoire, tu dois effectivement passer la variable LD_LIBRARY_PATH (ou faire un chroot mais passons). J'ai l'impression que la commande tcsh "setenv" fait effectivement ce qu'il faut, mais à ce moment là tu ne devrais pas avoir l'erreur. Essaye de lancer :

LD_LIBRARY_PATH=/home/sabrina/travail:$LD_LIBRARY_PATH ./a.out


Ça m'intéresserait aussi de voir le résultat de :

ldd a.out


Exemple : voici un exemple de programme linké avec une librairie compilée par mes soins. Comme tu le vois, celle-ci n'est pas trouvée.

        linux-vdso.so.1 =>  (0x00007fff15517000)
        libtorque_mando.so => not found
        libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007fd03b47e000)
        libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fd03b176000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fd03aef4000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fd03acde000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd03a953000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fd03a737000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fd03b6d7000)


Du coup à l'exécution j'ai l'erreur suivante :

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


À mon avis ton problème est le même : il faut (1) compiler la librarie (2) compiler l'exécutable en le linkant avec cette librairie (3) exécuter le programme.

Bonne chance
0
sabrina
 
j'ai juste changé d'ordinateur et refait mes fichiers avec un nom de lib différent c'est tout, donc j'ai mon ls:

a.out file.c file.o libmy.so main.c

et ce que tu m'as demandé:

ldd a.out
        linux-vdso.so.1 =>  (0x00007fff36bef000)
        libmy.so => not found
        libc.so.6 => /lib64/libc.so.6 (0x00007f3af819a000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f3af852a000)


DOnc oui il ne trouve pas la lib, pour j'ai bien fait mon setenv...
Comment compiler mon main.c en le linkant sans avoir d'erreur à l'exécution...
0
mamiemando Messages postés 33769 Date d'inscription   Statut Modérateur Dernière intervention   7 878
 
J'aurais dit que configurer LD_LIBRARY_PATH était suffisant, mais on dirait que non.
Ton .so et ton exécutable sont au même endroit (/home/sabrina/travail) ?
0