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 :

Petit soucis d'édition de liens.


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2010
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 33
    Points : 92
    Points
    92
    Par défaut Petit soucis d'édition de liens.
    Bonjour,

    Je développe depuis quelques temps une bibliothèque contenant plein de fonctions qui me servent pour l'ensemble de mes programmes en C (gcc sous Linux).
    Elle était jusque là compilé en tant que bibliothèque dynamique, mais j'aimerai avoir la possibilité de la compiler statiquement dans un de mes programmes.

    J'ai modifié mon makefile pour générer une archive ar contenant l'ensemble de mes fichiers objets tel que:
    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
    nm libFlo.a
    Fmath.o:
    00000000000000bf T Fipaire
    000000000000005c T Flgint
    0000000000000000 T Fpuiss
                     U _GLOBAL_OFFSET_TABLE_
     
    Fchaine.o:
    0000000000000848 T F_cmaj
    000000000000086c T F_cmin
    0000000000000890 T F_snombre
    000000000000096f T Fchaine_hex
    00000000000003fb T Fftoa
    00000000000008fa T Fhex_int
    0000000000000000 R Fhexa_table
    000000000000030f T Fitoa
                     U Flgint
                     U Fmalloc_meta
    00000000000002cf T Fmemset
    0000000000000530 T Fnb_c
    000000000000058f T Fnb_str
    [sortie tronquée]
    Et pourtant, quand je compile mon programme de test, ça plante à l'édition de lien, par exemple:
    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
    gcc -Wall -Wextra -O -g -static -L. -lFlo Ftest.c -o Ftest-statique
    /tmp/ccXpImbY.o: In function `comparaison_qsort_str':
    /mnt/Serveur-home/Developpement/C/libFlo/Ftest.c:350: undefined reference to `Fstrlen'
    /mnt/Serveur-home/Developpement/C/libFlo/Ftest.c:350: undefined reference to `Fstrlen'
    /tmp/ccXpImbY.o: In function `Exemple_Fitoa':
    /mnt/Serveur-home/Developpement/C/libFlo/Ftest.c:44: undefined reference to `Fitoa'
    /tmp/ccXpImbY.o: In function `Exemple_Fsplitstr':
    /mnt/Serveur-home/Developpement/C/libFlo/Ftest.c:55: undefined reference to `Fsplitstr'
    /tmp/ccXpImbY.o: In function `Exemple_Fstring':
    /mnt/Serveur-home/Developpement/C/libFlo/Ftest.c:69: undefined reference to `Fstring_init'
    /mnt/Serveur-home/Developpement/C/libFlo/Ftest.c:70: undefined reference to `Fstring_adds'
    /mnt/Serveur-home/Developpement/C/libFlo/Ftest.c:72: undefined reference to `Fstring_maj'
    /mnt/Serveur-home/Developpement/C/libFlo/Ftest.c:74: undefined reference to `Fstring_net'
    /mnt/Serveur-home/Developpement/C/libFlo/Ftest.c:76: undefined reference to `Fstring_addc'
    /mnt/Serveur-home/Developpement/C/libFlo/Ftest.c:77: undefined reference to `Fstring_cp'
    /mnt/Serveur-home/Developpement/C/libFlo/Ftest.c:78: undefined reference to `Fstring_adds'
    /mnt/Serveur-home/Developpement/C/libFlo/Ftest.c:80: undefined reference to `Fstring_min'
    /mnt/Serveur-home/Developpement/C/libFlo/Ftest.c:82: undefined reference to `Fstring_ins'
    /mnt/Serveur-home/Developpement/C/libFlo/Ftest.c:84: undefined reference to `Fstring_adds'
    /mnt/Serveur-home/Developpement/C/libFlo/Ftest.c:85: undefined reference to `Fstring_addi'
    /mnt/Serveur-home/Developpement/C/libFlo/Ftest.c:87: undefined reference to `Fstring_adds'
    /mnt/Serveur-home/Developpement/C/libFlo/Ftest.c:88: undefined reference to `Fstring_addf'
    /mnt/Serveur-home/Developpement/C/libFlo/Ftest.c:91: undefined reference to `Fstring_sprintf'
    J'ai essayé toute sorte de chose, comme compiler dynamiquement avec la libc mais en liant manuellement l'archive ar:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -Wall libFlo.a Ftest.c -o Ftest-statique
    Mais j'ai exactement le même problème.
    Est ce que quelqu'un a la moindre idée ?
    J'ai pensé que ça venait peut être de mon archive ar, parce la compilation statique marche très bien avec la librairie standard !

    Merci d'avance pour toute aide ou retour d'expérience.

  2. #2
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Quelle commande as-tu utilisé pour créer ta librairie statique?


    http://users.actcom.co.il/~choo/lupg...static_archive
    d'après ce site je vois

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ar rcs libtest.a fic1.o fic2.o ... ficN.o
    ranlib libtest.a
    Est-il possible d'avoir la trace de compilation complète?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2010
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 33
    Points : 92
    Points
    92
    Par défaut
    Merci pour cette réponse rapide.

    Hé bien à vrai dire j'utilisais pas l'outil ranlib.
    Ce que je faisais c'était une règle comme ça dans le makefile:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    %.o: %.c
    	$(CC) $(CFLAGS) -c $^
    	ar -rc ../lib$(nlib).a $@
    Pour tout fichier objet créé, on le rajoute dans l'archive (libFlo.a).
    Du coup j'ai essayé de suivre à la lettre ton tuto, comme par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ar rc lib.a fichier1.o fichier2.o
    ranlib lib.a
    Mais ça ne marche pas non plus, j'ai exactement le même problème :/

    MAJ: Et je tiens à préciser que quelque soit la méthode, quand j’extraie l'archive, j'ai bien tous mes fichiers objets.

  4. #4
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    et l'option -I vers les includes, je ne la vois pas dans ta ligne de commande de compilation ?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Août 2010
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 33
    Points : 92
    Points
    92
    Par défaut
    Foutu police de caractères, j'ai eu du mal à comprendre ce que tu voulais dire, je voyais un l alors que c'était un i majuscule. J'ai dû faire un c/c dans un éditeur de texte pour vérifier !

    Mais sinon, concernant mon problème ça ne change rien :/
    En fait j'aurais été étonné que ça vienne d'un problème avec les fichiers d'en-tête, la compilation se passe très bien, c'est l'édition de liens qui coince...

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Août 2010
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 33
    Points : 92
    Points
    92
    Par défaut Enfin !
    Bon, j'ai fini par trouver la solution, attention c'est extrêmement con, puisqu'il suffisait de changer l'ordre des paramètre transmis à gcc !

    Par exemple au lieu de compiler comme ça:
    gcc -static lib.a main.c -o test
    Il fallait compiler comme ça:
    gcc -static main.c lib.a -o test

    J'espère que c'est un bogue, parce que je trouve ça complètement idiot et si l'ordre est réellement important, pourquoi gcc ne serait il pas capable d'organiser tout seul l'ordre des traitements ?

    Bref si quelqu'un a le même problème, qu'il essai ça...

Discussions similaires

  1. Petit souci de lien
    Par UDSP50 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 24/02/2013, 19h52
  2. petit soucis lors d'un LOAD DATA INFILE
    Par Jovial dans le forum SQL Procédural
    Réponses: 9
    Dernier message: 04/06/2004, 11h58
  3. Réponses: 6
    Dernier message: 21/01/2004, 13h25
  4. [DEBUTANT] petits soucis avec un prgm de chat
    Par LechucK dans le forum MFC
    Réponses: 8
    Dernier message: 19/01/2004, 16h52
  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, 14h50

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