Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 9 sur 9
  1. #1
    Membre éclairé Avatar de rt15
    Homme Profil pro
    Développeur informatique
    Inscrit en
    octobre 2005
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : octobre 2005
    Messages : 204
    Points : 386
    Points
    386

    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.

  2. #2
    Membre éclairé Avatar de rt15
    Homme Profil pro
    Développeur informatique
    Inscrit en
    octobre 2005
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : octobre 2005
    Messages : 204
    Points : 386
    Points
    386

    Par défaut

    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.

  3. #3
    Membre émérite
    Inscrit en
    mars 2005
    Messages
    865
    Détails du profil
    Informations forums :
    Inscription : mars 2005
    Messages : 865
    Points : 972
    Points
    972

    Par défaut

    Hum... j'hésite à donner ma réponse. C'est tellement mal de ne pas suffixer par lib...

  4. #4
    Membre émérite
    Inscrit en
    mars 2005
    Messages
    865
    Détails du profil
    Informations forums :
    Inscription : mars 2005
    Messages : 865
    Points : 972
    Points
    972

    Par défaut

    Hum... pas de souci avec la ligne de commande suivante.

    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.

  5. #5
    Membre éclairé Avatar de rt15
    Homme Profil pro
    Développeur informatique
    Inscrit en
    octobre 2005
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : octobre 2005
    Messages : 204
    Points : 386
    Points
    386

    Par défaut

    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 ?

  6. #6
    Membre éclairé Avatar de rt15
    Homme Profil pro
    Développeur informatique
    Inscrit en
    octobre 2005
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : octobre 2005
    Messages : 204
    Points : 386
    Points
    386

    Par défaut

    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
    >

  7. #7
    Membre éclairé Avatar de rt15
    Homme Profil pro
    Développeur informatique
    Inscrit en
    octobre 2005
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : octobre 2005
    Messages : 204
    Points : 386
    Points
    386

    Par défaut

    gcc -> -soname
    hp -> +h
    solaris -> -h
    aix -> ??????

    Aaaaaaaaaarh !!!

  8. #8
    Membre émérite
    Inscrit en
    mars 2005
    Messages
    865
    Détails du profil
    Informations forums :
    Inscription : mars 2005
    Messages : 865
    Points : 972
    Points
    972

    Par défaut

    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.

  9. #9
    Membre éclairé Avatar de rt15
    Homme Profil pro
    Développeur informatique
    Inscrit en
    octobre 2005
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : octobre 2005
    Messages : 204
    Points : 386
    Points
    386

    Par défaut

    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.

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •