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èmes de link sous GCC


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2014
    Messages : 103
    Par défaut Problèmes de link sous GCC
    Bonjour,

    Commençant à être habitué aux erreurs de type "variable externe non définie", je voudrais fixer les choses une bonne fois pour toutes.

    Que peut signifier myFile.c/h/a : undefined reference to 'myVarOrFunction' :

    • Variable ou fonction non déclarée (le plus souvent, fichier d'include manquant) ?
    • Variable ou fonction déclarée (le plus souvent, dans un fichier d'include, mais non définie (le plus souvent, librairie ou code source C manquant) ?


    Remarque : sous Visual C++, je crois savoir qu'on peut effectuer la distinction entre les deux :

    • Undeclared identifier signifie "variable non déclarée" (ou, le plus souvent, fichier d'include manquant)
    • Unresolved external symbol signifie "variable non définie" (ou, le plus souvent, librairie ou code C manquant)


    J'en profite pour poser une deuxième question qui est le problème que je dois résoudre actuellement.

    Essayant de compiler Valgrind sous RedHat EL6, je suis confronté à l'erreur suivante :

    /usr/lib/libdl.so : undefined reference to `_dl_tls_get_addr_soft@GLIBC_PRIVATE'.

    Quel peut-être le problème ? Manque-t-il un fichier d'include quelque part ? Ou une librairie statique ? Ou une librairie dynamique ?

    Merci à tous pour vos réponses.

  2. #2
    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
    undefined reference signifie que le nom n'est pas connu, donc qu'a priori, effectivement, c'est un include manquant ca c'est Undeclared identifier
    désolé.

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 485
    Par défaut
    Bonjour,

    Citation Envoyé par Jimmy91 Voir le message
    Bonjour,

    Commençant à être habitué aux erreurs de type "variable externe non définie", je voudrais fixer les choses une bonne fois pour toutes.

    Que peut signifier myFile.c/h/a : undefined reference to 'myVarOrFunction' :
    C'est une erreur extrêmement fréquente qui signifie littéralement « référence indéfinie à <nom_de_fonction_ou_de_ressource_quelconque> ». C'est un message qui n'est pas émis par le compilateur mais par l'éditeur de liens, à l'étape suivante : il signifie que le code compilé fait référence à quelque chose qui se trouve à l'extérieur mais qu'au moment d'assembler ensemble toutes les unités compilées concernées, il y a un symbole qu'il ne retrouve nulle part. Il ne peut donc pas le résoudre ni finaliser la création de l'exécutable.

    Autrement dit : tu appelles dans ton programme une fonction d'une bibliothèque tierce, cette bibliothèque est probablement bien installée sur ton système, mais tu oublies de passer le nom de cette bibliothèque au compilateur.

    Avec GCC, sous Unix, c'est l'option « -l » (« L » minuscule) qui permet de spécifier une bibliothèque à impliquer dans le projet, privée de son préfixe « lib » et de ses extensions « .so.* ». Par exemple, la bibliothèque mathématique détaillée par <math.h> s'appelle /usr/lib/libm.so sur le système. Il faudra donc compiler avec :

    Code Shell : Sélectionner tout - Visualiser dans une fenêtre à part
    $ gcc monprogramme.c -o monprogramme -lm

    J'en profite pour poser une deuxième question qui est le problème que je dois résoudre actuellement.

    Essayant de compiler Valgrind sous RedHat EL6, je suis confronté à l'erreur suivante :

    /usr/lib/libdl.so : undefined reference to `_dl_tls_get_addr_soft@GLIBC_PRIVATE'.

    Quel peut-être le problème ? Manque-t-il un fichier d'include quelque part ? Ou une librairie statique ? Ou une librairie dynamique ?
    Dans ce cas précis, l'origine se trouve peut-être dans un conflit de packages. Voici un article déjà ancien qui traitait du même problème. Je ne sais pas s'il est toujours d'actualité sur les distributions récentes :

    http://jingfenghanmax.blogspot.fr/20...-to-error.html

    Citation Envoyé par leternel Voir le message
    undefined reference signifie que le nom n'est pas connu, donc qu'a priori, effectivement, c'est un include manquant
    Non, justement : une fonction non préalablement déclarée quelque part engendre des protestations de la part du compilateur, mais peut valoir déclaration (implicite) dans certains cas, et le message d'erreur n'est pas le même. S'il n'y a pas de message d'erreur précédant celui qui nous intéresse, celui-ci est typique d'une fonction proprement déclarée dans le programme mais qui ne peut être résolue a posteriori.

  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
    en effet, je me suis embrouillé en lisant son message dans le désordre, c'est Undeclared identifier que j'ai décris.

  5. #5
    Membre très actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2014
    Messages : 103
    Par défaut
    Bonjour,

    Merci à tous les deux pour vos réponses très complètes. À présent je fais bien la distinction entre 'Undefined reference to...' et 'Undeclared identifier'.

    Citation Envoyé par Obsidian
    l'origine se trouve peut-être dans un conflit de packages
    Cette information m'a mis la puce à l'oreille. En vérifiant la version de la librairie libdl.so exigée par le programme à compiler et en la comparant avec la mienne, j'ai constaté une différence de version. Installer la version exigée par le programme a immédiatement résolu mon problème.

    Encore merci à tous les deux !

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

Discussions similaires

  1. Link-Time Code Generation (LTCG) sous GCC
    Par étoile de mer dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 16/10/2009, 19h28
  2. Problème de link sous Turbo C 2.0
    Par nanou1983 dans le forum C
    Réponses: 8
    Dernier message: 05/09/2007, 10h03
  3. Problème de link ODE/OpenGL sous Dev-cpp
    Par Milanber9999 dans le forum ODE
    Réponses: 3
    Dernier message: 09/05/2007, 01h46
  4. Réponses: 5
    Dernier message: 09/04/2006, 19h02

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