Compiler avec une librairie partagée
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
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
A voir également:
- Librairie valentine wtf
- Librairie anspach - Forum Consommation & Internet
- Valentine wtf connexion - Forum Consommation & Internet
- Attente d'une commande librairie Anspach - Forum Consommation & Internet
- Logiciel librairie - Forum Bureautique
- Librairie lame pour audacity - Télécharger - Création musicale
9 réponses
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 :
Bonne chance
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
alors voici ce que j'obtiens:
et finalement ça a marché avec cette ligne que j'ai tapé un peu comme une lib statique finalement:
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?
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?
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 :
(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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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:
Première erreur, donc je fais ça:
ça marche, ensuite je fais ceci:
setenv LD_LIBRARY_PATH /home/sabrina/travail
et finalement:
Aurais tu une idée à tout hasard car je fouille tous les tutos mais rien ne marche...
merci.
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.
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
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é:
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...
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...