Précédent   Forum du club des développeurs et IT Pro > C et C++ > Outils pour C & C++ > GCC
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 04/06/2009, 16h02   #1
rt15
Membre éprouvé
 
Avatar de rt15
 
Homme
Développeur informatique
Inscription : octobre 2005
Messages : 203
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France, Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : octobre 2005
Messages : 203
Points : 435
Points : 435
Par défaut [gcc]Se lier à des .so sans préfixes et pas dans le rep courant

Bonjour,

Voilà les hypothèses que je ne peux pas changer :
  1. Mon fichier final doit se lier statiquement avec une librairie dynamique .so.
  2. Mon fichier .so n'est pas préfixé par "lib".
  3. Je ne peux pas avoir mon .so dans le répertoire courant au moment de la compilation.
  4. A l'exécution, mon fichier .so se trouve dans un répertoire de LD_LIBRARY_PATH.

Actuellement, le .so est dans le répertoire courant à la compilation, et j'ai simplement : passé à la ligne de compilation. Et tout marche bien. Mais il ne faut plus qu'il soit dans le répertoire courant car je suis en train de séparer les fichiers intermédiaires du source. Donc mon répertoire courant est celui du Makefile, et je ne veux pas y mettre de binaires (toto.so est compilée par moi).

Je ne peux pas utiliser -l car toto.so ne s'appelle pas libtoto.so. Donc je ne peux pas utiliser -L, car elle est utilisée que si -l est utilisée.

Donc si toto.so ne se trouve pas dans le répertoire courant j'obtiens :
Code :
gcc: toto.so: No such file or directory
à la compilation.

Et ce, même si toto.so est dans le PATH.

Et si je met le chemin complet vers toto.so dans la ligne de compile : J'ai l'erreur à l'exécution :
Code :
./MonApp: error while loading shared libraries: MonRep/toto.so: cannot open shared object file: No such file or directory
même si toto.so se trouve dans le LD_LIBRARY_PATH...
Il me cherche la librairie avec le répertoire, comme dans ma ligne de link.

Bilan, comment faire pour avoir MonRep/toto.so dans la ligne de compilation, mais que l'exécutable cherche bien toto.so dans LD_LIBRARY_PATH ?

Merci d'avance de vos éclaircissements.

[edit]
une solution à base de ln -s ne me satisfait pas a priori : je me retrouverais avec un exécutable qui recherche libtoto.so.
rt15 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/06/2009, 17h50   #2
rt15
Membre éprouvé
 
Avatar de rt15
 
Homme
Développeur informatique
Inscription : octobre 2005
Messages : 203
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France, Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : octobre 2005
Messages : 203
Points : 435
Points : 435
Visblement, pourrait me sauver la mise, mais je parviens pas à m'en servir.

[edit]
Comprend pas... Cette option n'est précisé nul part dans le man de gcc...

[edit 2]
Marche que sous windows on dirait !

[edit 3]
Ou alors c'est la version de ld, 2.15 sous linux, 2.18 sous windows.

[edit 4]
Bon alors oui c'est un problème de version, marche pas non plus sous windows en ld 2.16.
rt15 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/06/2009, 21h24   #3
aoyou
Membre émérite
 
Inscription : mars 2005
Messages : 860
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 860
Points : 964
Points : 964
Hum... j'hésite à donner ma réponse. C'est tellement mal de ne pas suffixer par lib...
aoyou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/06/2009, 21h27   #4
aoyou
Membre émérite
 
Inscription : mars 2005
Messages : 860
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 860
Points : 964
Points : 964
Hum... pas de souci avec la ligne de commande suivante.

Citation:
g++ *.o -o executable MonRep/toto.so
Et en positionnant le LD_LIBRARY_PATH au répertoire qui va bien, il n'y a pas de souci pour charger la librairie à l'exécution.

Testé avec Ubuntu.
aoyou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2009, 14h53   #5
rt15
Membre éprouvé
 
Avatar de rt15
 
Homme
Développeur informatique
Inscription : octobre 2005
Messages : 203
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France, Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : octobre 2005
Messages : 203
Points : 435
Points : 435
Heing ? Et tu bouges ton exécutable ? Tu mets quoi comme répertoire dans LD_LIBRARY_PATH, celui où tu as linker ton exécutable (MonRep/toto.so y existe...), ou celui de la librairie ?

Voilà un essai bateau.
Je compile une librairie dans libdir.
Je compile un programme se liant à libdir/mylib.so.
Je teste sans bouger le programme -> Ca marche.
Je déplace mon programme dans prog dir.
J'essaie d'ajuster LD_LIBRARY_PATH, mais cela ne fonctionne pas.
Si je regarde les dépendances de mon exécutable avec ldd, je vois qu'il cherche encore et toujours avec un nom de répertoire...
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
angelina:/nfs/usr/brbo/temp/shared
> ls
libdir  myprog.c  progdir
angelina:/nfs/usr/brbo/temp/shared
> cd libdir
angelina:/nfs/usr/brbo/temp/shared/libdir
> cat mylib.c
int exported_func()
{
  return 12;
}
 
angelina:/nfs/usr/brbo/temp/shared/libdir
> gcc -Wall -fPIC -c mylib.c
angelina:/nfs/usr/brbo/temp/shared/libdir
> gcc -shared -o mylib.so mylib.o
angelina:/nfs/usr/brbo/temp/shared/libdir
> cd ..
angelina:/nfs/usr/brbo/temp/shared
> cat myprog.c
#include <stdio.h>
 
int exported_func();
 
int main()
{
  printf("%d\n", exported_func());
  return 0;
}
 
angelina:/nfs/usr/brbo/temp/shared
> gcc -Wall myprog.c -o myprog libdir/mylib.so
angelina:/nfs/usr/brbo/temp/shared
> myprog
12
angelina:/nfs/usr/brbo/temp/shared
> cp myprog progdir/
angelina:/nfs/usr/brbo/temp/shared
> cd progdir/
angelina:/nfs/usr/brbo/temp/shared/progdir
> myprog
myprog: error while loading shared libraries: libdir/mylib.so: cannot open shared object file: No such file or directory
angelina:/nfs/usr/brbo/temp/shared/progdir
> export LD_LIBRARY_PATH=..:../libdir:$LD_LIBRARY_PATH
angelina:/nfs/usr/brbo/temp/shared/progdir
> myprog
myprog: error while loading shared libraries: libdir/mylib.so: cannot open shared object file: No such file or directory
angelina:/nfs/usr/brbo/temp/shared/progdir
> ldd myprog
        libdir/mylib.so => not found
        libc.so.6 => /lib/tls/libc.so.6 (0x001a4000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00406000)
angelina:/nfs/usr/brbo/temp/shared/progdir
[edit]

Merci au fait...

En quoi c'est mal de ne pas préfixer ?
rt15 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2009, 15h18   #6
rt15
Membre éprouvé
 
Avatar de rt15
 
Homme
Développeur informatique
Inscription : octobre 2005
Messages : 203
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France, Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : octobre 2005
Messages : 203
Points : 435
Points : 435
Yeah ! Avec -soname on dirait que je peux m'en sortir !

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
angelina:/nfs/usr/brbo/temp/shared/libdir
> gcc -shared -Wl,-soname,mylib.so -o mylib.so mylib.o
angelina:/nfs/usr/brbo/temp/shared/libdir
> cd ..
angelina:/nfs/usr/brbo/temp/shared
> gcc -Wall myprog.c -o myprog libdir/mylib.so
angelina:/nfs/usr/brbo/temp/shared
> cp myprog progdir/
angelina:/nfs/usr/brbo/temp/shared
> cd progdir/
angelina:/nfs/usr/brbo/temp/shared/progdir
> export LD_LIBRARY_PATH=../libdir:$LD_LIBRARY_PATH
angelina:/nfs/usr/brbo/temp/shared/progdir
> myprog
12
angelina:/nfs/usr/brbo/temp/shared/progdir
> ldd myprog
        mylib.so => ../libdir/mylib.so (0x00f7d000)
        libc.so.6 => /lib/tls/libc.so.6 (0x00244000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x006f9000)
angelina:/nfs/usr/brbo/temp/shared/progdir
>
rt15 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2009, 18h23   #7
rt15
Membre éprouvé
 
Avatar de rt15
 
Homme
Développeur informatique
Inscription : octobre 2005
Messages : 203
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France, Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : octobre 2005
Messages : 203
Points : 435
Points : 435
gcc -> -soname
hp -> +h
solaris -> -h
aix -> ??????

Aaaaaaaaaarh !!!
rt15 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2009, 13h00   #8
aoyou
Membre émérite
 
Inscription : mars 2005
Messages : 860
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 860
Points : 964
Points : 964
Ton LD_LIBRARY_PATH doit contenir le chemin vers la librairie dynamique. Pour ne pas t'embêter, mets un chemin absolu.

Toutefois, je trouve très curieux que ton ldd mette le chemin MonRep. Pour ma part, il me met juste le nom de la librairie.

Euh oui effectivement, il faut positionner le soname pour que ldd ne mette que le nom de la librairie.

Pourquoi préfixer par lib ? Car c'est standard, c'est tout. Toutefois, sous Windows, on ne préfixe pas.
aoyou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2009, 09h40   #9
rt15
Membre éprouvé
 
Avatar de rt15
 
Homme
Développeur informatique
Inscription : octobre 2005
Messages : 203
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France, Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : octobre 2005
Messages : 203
Points : 435
Points : 435
Bon finalement quelqu'un m'a donné la solution pour aix : -bnoipath, mais à utiliser lors du link du programme, pas de la librairie.

Merci pour tes essais aoyou. C'est vrai que mes prédécesseurs auraient pu préfixer par lib quand même.
rt15 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 08h37.


 
 
 
 
Partenaires

Hébergement Web