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 :

clang 'undifined symbol' incomprehension


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 33
    Par défaut clang 'undifined symbol' incomprehension
    Bonjour,

    Je compile habituellement sur GCC avec comme flag -Wall -Wextra et -Werror. Et jusqu'ici pas de soucis.
    Me voici maintenant sur clang et j'obtiens une erreur au moment de la résolution des liens que je n'arrive ni à comprendre, ni à résoudre.. Peut être est-ce parce que je m'y prend mal mais que GCC est gentil?.. Lui!

    Cette erreur apparait à chaque fois que j'essaie d'utiliser une variable global déclarée dans une librairie (*.a)

    Voici mon test réalisé sur de très petits fichiers pour isolé l'erreur: (2 fichier sources 'test.c' et 'use_test.c' + 1 header 'test.h' pour créer une petite librairie libtest.a) + un fichier 'main.c' qui tente d'utiliser cette librairie..

    test.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #ifndef TEST_H
    # define TEST_H
     
    # include <stdio.h>
     
    extern int	g_test;
     
    int	        use_global_test(void);
     
    #endif
    test.c:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #include "test.h"
     
    int	g_test;
    use_test.c:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include "test.h"
     
    int	use_global_test(void)
    {
    	g_test = 42;
    	printf("g_test  successfully affected: `g_test = %d`\n", g_test);
    	return (0);
    }
    La creation de 'libtest.a' (qui ne retourne aucune erreur):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    clang -Wall -Wextra -Werror -o test.o -c test.c -I.
    clang -Wall -Wextra -Werror -o use_test.o -c use_test.c -I.
     
    ar rc libtest.a test.o use_test.o
    main.c:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include "test.h"
     
    int	main(void)
    {
    	use_global_test();
    	return (0);
    }
    Et enfin la compile qui foire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    clang -Wall -Wextra -Werror -o test main.c -L. -ltest -I.
    L'erreur en question:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Undefined symbols for architecture x86_64:
      "_g_test", referenced from:
          _use_global_test in libtest.a(use_test.o)
    ld: symbol(s) not found for architecture x86_64
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    Je mettrai le résultat de la compile avec -v si vous ne voyez pas d'énormité de ma part.. Mais elle ne me dit rien de très intéressant..

    Merci!

  2. #2
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Hello,

    Tu parles de clang, mais tu mets les lignes de compilation de gcc... C'est vraiment ton cas ?

    Est-ce que tu as bien compilé la lib ET l’exécutable avec le même compilateur ?
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 33
    Par défaut
    Autant pour moi.. J'ai fais un copié/collé, j'édite tout de suite.

    En fait chez moi c'est gcc sur Debian.
    A l'école c'est clang sur mac os, avec un alias gcc=clang, donc clang dans tous les cas.

    J'ai fais le test ce matin (à l'école) avec les fichiers de mon premier post, rien de plus, rien de moins, en direct.. Donc oui tout compilé avec le même compilateur exactement comme sur le premier post (édité).

    Merci pour l’intérêt que tu portes à mon cas!

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Petite question, parce que je ne sais pas: clang reprend les memes options que gcc, concernant les -W...?

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 33
    Par défaut
    Bonjour,

    Un 'clang --help' indique:

    -W<warning> Enable the specified warning


    Pas très spécifique.. Et je ne trouve rien concernant la liste de ces warnings sur mon man.
    Par contre, -Wall -Wextra -Werror ne déclenchent par d'erreurs, contrairement à -Wtoto:

    error: unknown warning option '-Wtoto' [-Werror,-Wunknown-warning-option]

    Sur le net j'ai pu lire que clang était plus pointilleux.. cf: https://spin.atomicobject.com/2013/1...lang-compiler/

    Voilà voilà.

  6. #6
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Oui, les compilateurs n'ont pas la même interprétation des normes, et gcc est connu pour être particulièrement peu regardant (une des raisons de son succès ?), mais cela n'explique pas pourquoi tu as une erreur.

    Ce que je trouve étrange, c'est l'erreur est sur _g_test, pas sur g_test. Est-ce que tu peux faire le test en créant un nouveau répertoire, dans lequel tu copies/colle les fichiers que tu as mis dans ton post ? Est-ce que tu as toujours la même erreur ?
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

Discussions similaires

  1. [Objective-C] undifined symbol for architecture i386
    Par smobydick dans le forum Objective-C
    Réponses: 9
    Dernier message: 26/03/2013, 14h24
  2. Code ASCII du symbole Euro
    Par FW-S dans le forum Delphi
    Réponses: 9
    Dernier message: 03/04/2007, 01h27
  3. Organigramme d'un algorithme, convention de symboles
    Par rstephane dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 12/06/2003, 17h47
  4. [Sybase] Définition des symboles
    Par SoaB dans le forum Sybase
    Réponses: 5
    Dernier message: 19/03/2003, 23h06
  5. symbole ##
    Par JEG dans le forum C
    Réponses: 2
    Dernier message: 23/01/2003, 19h15

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