IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GCC Discussion :

[gcc]Se lier à des .so sans préfixes et pas dans le rep courant


Sujet :

GCC

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 262
    Points : 665
    Points
    665
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    ./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
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 262
    Points : 665
    Points
    665
    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 éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Hum... j'hésite à donner ma réponse. C'est tellement mal de ne pas suffixer par lib...

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    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
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 262
    Points : 665
    Points
    665
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 262
    Points : 665
    Points
    665
    Par défaut
    Yeah ! Avec -soname on dirait que je peux m'en sortir !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 262
    Points : 665
    Points
    665
    Par défaut
    gcc -> -soname
    hp -> +h
    solaris -> -h
    aix -> ??????

    Aaaaaaaaaarh !!!

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    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
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 262
    Points : 665
    Points
    665
    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.

Discussions similaires

  1. [XL-2010] Lier des segments qui ne partagent pas la même source
    Par pedrolapercu dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 21/06/2018, 15h34
  2. [XL-2010] Lier des segments qui ne partagent pas la même source
    Par sanae430 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 03/08/2013, 10h07
  3. [AC-2003] Lier des tables sans ODBC
    Par stigma dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 04/06/2009, 09h08
  4. Réponses: 2
    Dernier message: 02/01/2009, 11h38
  5. Noms des colonnes ne s'affichent pas dans un JTable
    Par Bourdet dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 07/07/2005, 16h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo