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 :

Problème d'édition des liens dans un makefile


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2014
    Messages : 5
    Par défaut Problème d'édition des liens dans un makefile
    Bonjour,

    Je débute en C et j'ai un soucis d'éditions des liens au moment de la génération du binaire. J'obtiens l'erreur suivante:
    "undefined reference to".

    Pourtant il se trouve que les librairies statiques (*.a) ont l'air de bien être ajouté au niveau du makefile...

    Voici les traces de log lorsque de l'exécution de la commande make:
    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
     
    [fedora@localhost main]$ make
    gcc -o main.o -c main.c -W -Wall -Wno-unused -I ../evt -I ../display -I ../e2gdi -I ../evt -I ../tvml -I ../e2evt -I ../e2tvui	    
    main.c: In function 'main':
    main.c:14:14: warning: unused parameter 'argc' [-Wunused-parameter]
     int main(int argc, char **argv)
                  ^
    main.c:14:27: warning: unused parameter 'argv' [-Wunused-parameter]
     int main(int argc, char **argv)
                               ^
    gcc -MM -W -Wall -Wno-unused -I ../evt -I ../display -I ../e2gdi -I ../evt -I ../tvml -I ../e2evt -I ../e2tvui	     main.c > main.d
    gcc -o tv main.o -L. -le2tvui -le2evt -ltvml -ldisplay -le2gdi -levt 
    main.o: In function `main':
    main.c:(.text+0x1f): undefined reference to `initTvui'
    collect2: error: ld returned 1 exit status
    make: *** [tv] Error 1
    [fedora@localhost main]$

    Voici le contenu de mon makefile:
    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
     
    EXEC=tv
     
    INCLUDES  = \
    		-I ../evt \
    	    -I ../display \
    	    -I ../e2gdi \
    	    -I ../evt \
    	    -I ../tvml \
    	    -I ../e2evt \
    	    -I ../e2tvui
     
    CFLAGS = -W -Wall -Wno-unused $(INCLUDES)	    
     
    all: $(EXEC)
     
    $(EXEC): main.o
    	$(CC) -o $(EXEC) main.o -L. -le2tvui -le2evt -ltvml -ldisplay -le2gdi -levt 
    	#-lzunexit
    	#$(CC) -o $(EXEC) main.o ./libe2evt.a ./libe2tvui.a ./libtvml.a ./libdisplay.a ./libe2gdi.a ./libevt.a
     
    %.o: %.c
    	$(CC) -o $@ -c $< $(CFLAGS)
    	$(CC) -MM $(CFLAGS) $*.c > $*.d
     
    clean:
    	rm -fr *.o *.d  
    	rm -fr $(EXEC)
    Les librairies requises sont: "libe2tvui.a", "libe2evt.a", 'libtvml.a", "libdisplay.a", 'libe2gdi.a" et "libevt.a". Ces fichiers se trouvent tous dans le répertoire courant / de compilation.

    L'ajout des librairies statique pour l'édition des liens est elle correctement configurée dans le makefile?

    En vous remerciant pour votre aide,

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 498
    Billets dans le blog
    1
    Par défaut
    Les *.a sont dans . ? Pourquoi ne pas rajouter ce chemin avec -I mais plutôt ../xxxx ?

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2014
    Messages : 5
    Par défaut
    Bonjour,

    Merci pour votre réponse.

    Effectivement les *.a sont bien dans le répertoire courant . (je les ai copié).
    Pour les includes ils sont bien dans un répertoire parent (../evt -I ../display -I ../e2gdi -I ../evt -I ../tvml -I ../e2evt -I ../e2tvui).

    La génération du .o marche. Je rencontre uniquement un problème lors de l'édition des liens.

    En vous remerciant par avance pour votre aide.

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 498
    Billets dans le blog
    1
    Par défaut
    Vraiment désolé, j'ai raconté n'importe quoi car j'ai confondu -I et -L....

    Il ne manque que le symbole "initTvui" ou nous as-tu donné seulement un extrait du message d'erreur ? Dans le cas 1, pourrais-tu essayer de regarder la table des symboles de tes fichiers *.a pour vérifier qu'ils contiennent bien ce symbole (readelf -s *.a si je ne dis pas de bêtise cette fois).

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2014
    Messages : 5
    Par défaut
    Merci pour votre réponse.

    Voici le résultat de la commande sur la dépendance statique qui pose problème:

    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
     
    [fedora@localhost main]$ readelf -s libe2tvui.a 
     
    File: libe2tvui.a(e2tvui.o)
     
    Symbol table '.symtab' contains 21 entries:
       Num:    Value          Size Type    Bind   Vis      Ndx Name
         0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
         1: 0000000000000000     0 SECTION LOCAL  DEFAULT    1 
         2: 0000000000000000     0 SECTION LOCAL  DEFAULT    3 
         3: 0000000000000000     0 SECTION LOCAL  DEFAULT    6 
         4: 0000000000000000     8 OBJECT  LOCAL  DEFAULT    3 _ZL11pLibDirName
         5: 0000000000000008     8 OBJECT  LOCAL  DEFAULT    3 _ZL11pVarDirName
         6: 0000000000000000     0 SECTION LOCAL  DEFAULT    5 
         7: 0000000000000000     0 SECTION LOCAL  DEFAULT    7 
         8: 0000000000000000     0 SECTION LOCAL  DEFAULT    8 
         9: 0000000000000000     0 SECTION LOCAL  DEFAULT    9 
        10: 0000000000000000    71 FUNC    GLOBAL DEFAULT    1 _Z8initTvuiv
        11: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND puts
        12: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND setShellKeys
        13: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND initGdi
        14: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND _Z11initDisplayPKc
        15: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND startAppMgr
        16: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND unactivateTvui
        17: 0000000000000047    31 FUNC    GLOBAL DEFAULT    1 _Z8exitTvuiv
        18: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND stopAppMgr
        19: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND exitGdi
        20: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND _Z11exitDisplayv
    [fedora@localhost main]$
    J'observe que mes noms de méthodes sont préfixés par des symbole bizarre dans cette table. Par exemple la méthode "initTvui" que j'appelle est préfixé par la chaine "_Z8" (_Z8initTvuiv) et suffixé par 'v'. Je suppose que ce n'est pas normale et que c'est cela qui pose problème (?).

    En vous remerciant,

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 498
    Billets dans le blog
    1
    Par défaut
    C'est le seul symbole que ld ne trouve pas ou y en a t-il d'autres ?

    Si cas 1, essaye d'appeler directement le bon symbole. Pour cela, il te faut le définir avec une déclaration, comme ceci mais en adaptant le proto :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern void _Z8initTvuiv(void);
    Tu appelles cette fonction à la place de initTvui pour voir.

    Si cas 2, voir avec quelqu'un qui s'y connait plus que moi en makefile pour vérifier d'abord s'il n'y a pas une bêtise ^^ Ensuite, faire le même genre de manipulations avec readelf pour voir pourquoi ça déconne, si tous les fichiers .a ont le même problème, si ce sont tous les symboles ou seulement certains au sein d'un même .a, etc.

Discussions similaires

  1. Réponses: 1
    Dernier message: 31/12/2007, 02h59
  2. Réponses: 3
    Dernier message: 04/07/2007, 15h08
  3. Problème à l'édition des liens
    Par Frederick_Etudiant dans le forum Code::Blocks
    Réponses: 3
    Dernier message: 03/05/2007, 18h01
  4. [Dev-C++] Problème d'édition des liens
    Par shura dans le forum EDI
    Réponses: 5
    Dernier message: 30/08/2005, 10h35
  5. Problème à l'édition des liens avec BCC55 et Xerces
    Par ShootDX dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 30/11/2003, 15h50

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