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

C++ Discussion :

G++ et makefile, problème de dépendances


Sujet :

C++

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut G++ et makefile, problème de dépendances
    Bonjour à tous,

    Me voici dans cette situation :

    Je possède deux bibliothèques, lib1.a et lib2.a. lib2.a utilise liba.a.

    Les deux compiles correctement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    LIB=lib1
    OBJ= $(SRC:.cpp=.o)
     
    all : $(LIB)
     
    lib1 : $(OBJ)
    	ar rcs $(LIB).a $^ $(LDFLAGS)
     
    $(OBJ): %.o: %.cpp
    	@$(CC) -o $@ -c $< $(CFLAGS)
    (pareil pour lib2.a)

    En revanche lorsque j'essaye de compiler un exécutable lié avec lib2.a, j'ai des erreurs m'indiquant que lib2.a possède des symboles indéfinis qui sont présents dans lib1.a.

    En suivant le même principe pour le makefile :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    App : $(OBJ)
       g++ -o app $^ lib2.a
    Erreur :

    lib2_fichier.cpp.text+0x48): référence indéfinie vers « lib2::ns::MaClasse::MaFonction(bool) »
    Alors ma question principale est :
    - Est-ce que la dépendance de lib2.a envers lib1.a doit se gérer au niveau de la construction de lib2.a ou celle de "app" ?

    Ensuite si vous pouviez me donner une piste pour faire avancer les choses, ça serait bien sympa

    Merci par avance,

    A bientôt
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Il semble actuellement que lib1 appelle une fonction non définie dans lib2 (si ce n'est pas lib1, c'est votre application). L'éditeur de lien ne retrouver pas toutes les définitions nécessaires.
    Vérifiez que les signatures de fonction sont les bonnes et que toutes les fonctions sont bien définies (et compilées). Peut être vous oubliez une fichier .cpp en compilant votre lib2.

    Notez que pour une bibliothèque, l'éditeur de liens ne peux pas savoir si la fonction va être définie dans la bibliothèque ou plus tard (dans le programme qui utilise la bibliothèque ou une autre bibliothèque), du coup, à la compilation de la bibliothèque, quelques erreurs sont "laissées" (ne sont pas détectables).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    J'ai bidouiller plusieurs trucs, et désormais ça fonctionne.

    En fait j'avais app qui utilisait lib2.a, et lib2.a qui utilisait lib1.a.

    lib1.a et lib2.a compilaient correctement, mais en compilant app (lié avec lib2.a), ça indiquait "lib2.a, symbole externe non définit" sur des fonctions de lib1.a bien que lib2.a liait lib1.a.

    Finalement, en plus de lier lib2.a j'ai aussi lié lib1.a dans app et ça a compilé.

    Mais je trouve ça bizarre quand même que app doive injecter un "sous traitant" d'un "sous traitant", dans une logique naturelle, il n'est pas censé le connaître.

    Du coup si lib2.a change ses choix en utilisant lib3.a et non plus lib1.a, cela aura un impact dans la compilation de app, d'un point de vue logique, ça me dérange.

    Bon après peut-être que je me plante, j'ai peut-être lié tout avec tout sans vraiment savoir ce que je faisais, le principal étant que ça compile et ça s'exécute, c'est déjà pas mal pour un début, j'y ferai le ménage plus tard.

    En tout cas merci beaucoup pour ta réponse.

    A bientôt et bon dimanche !
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Ne manquais t-il pas une option -static ?
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Une lib statique, c'est simple, c'est pas autre chose qu'une archive de .o (c'est pas un tar, c'est un format ancêtre de celui de tar) auquel on a ajouté un index pour accélérer le traitement. En particulier, ça ne stocke pas ses dépendances (as-tu seulement tenté de les indiquer? sinon, ça ne devrait pas t'étonner qu'elles ne soient pas prises en compte, si oui, je me demande comment).

    Il est possible de copier une lib dans une autre, mais d'après ce que j'ai observé ça ne se fait pas souvent.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

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

Discussions similaires

  1. [Makefile] Problème de dépendance
    Par Invité dans le forum Linux
    Réponses: 4
    Dernier message: 29/03/2012, 03h55
  2. [REDHAT] Problèmes de dépendances à libssl et libcrypto
    Par djshaker dans le forum RedHat / CentOS / Fedora
    Réponses: 3
    Dernier message: 08/03/2007, 14h42
  3. makefile problème compilation
    Par Goundy dans le forum C
    Réponses: 11
    Dernier message: 01/10/2006, 23h24
  4. [win32] Problème de dépendances
    Par FamiDoo dans le forum MFC
    Réponses: 5
    Dernier message: 11/07/2006, 09h11
  5. Problème de dépendances dans une table
    Par PrinceMaster77 dans le forum Outils
    Réponses: 1
    Dernier message: 22/11/2004, 12h39

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