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 :

impossibe de compiler : undefined reference


Sujet :

C

  1. #1
    Membre régulier Avatar de paragoge
    Profil pro
    Inscrit en
    Février 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 115
    Points : 71
    Points
    71
    Par défaut impossibe de compiler : undefined reference
    Je voudrais tester ce programme mais la compilation ne se fait pas "undefined reference to 'gsl_ieee_printf_float'
    J'ai pourtant bien le package gsl (avec gsl_ieee_utils.h) et il se trouve dans usr/include
    Quelle peut-être la cause de ce problème?
    Je débute en c et je voudrais pouvoir tester des petits programmes instructifs comme celui ci par ex.

    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
    #include <stdio.h>
    #include <gsl/gsl_ieee_utils.h>
     
    int
    main (void) 
    {
      float f = 1.0/3.0;
      double d = 1.0/3.0;
     
      double fd = f; /* promote from float to double */
     
      printf (" f="); gsl_ieee_printf_float(&f); 
      printf ("\n");
     
      printf ("fd="); gsl_ieee_printf_double(&fd); 
      printf ("\n");
     
      printf (" d="); gsl_ieee_printf_double(&d); 
      printf ("\n");
     
      return 0;
    }

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Salut

    Il faut pas seulement inclure les fichiers *.h, il faut aussi ajouter les librairies (dans les options du projet, ou en ligne de commande - ça dépend si tu utilises un IDE ou pas).

  3. #3
    Membre régulier Avatar de paragoge
    Profil pro
    Inscrit en
    Février 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 115
    Points : 71
    Points
    71
    Par défaut
    Je ne sais pas de quelles librairies tu veux parler. Je travaille avec emacs...

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Je ne sais pas de quelles librairies tu veux parler.
    Avec la/les librairie(s) du pack gsl (que je ne connais pas).

    Les *.h permettent simplement au compilateur de savoir qu'il existe telle ou telle fonction, avec tel nombre arguments de tels ou tels types, fonction renvoyant tel ou tel type en retour. C'est important pour la compilation. Mais cela ne fait pas tout.
    L'éditeur des liens (pour construire l'exécutable) a besoin du code binaire de ladite librairie (une librairie contient une quantité de fonctions compilées), afin de l'intégrer dans l'exécutable. S'il ne trouve pas la librairie, il ne peut donc pas intégrer les fonctions dans l'exécutable. D'où l'erreur de linkage.

    Il y a la doc (chap. 2.2.x) : http://www.gnu.org/software/gsl/manu...ng-and-Linking

  5. #5
    Membre régulier Avatar de paragoge
    Profil pro
    Inscrit en
    Février 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 115
    Points : 71
    Points
    71
    Par défaut
    Merci, je viens de compiler avec les instructions de ton lien. Un ficher .o a été créé et j'étudie le lien que tu m'as donné

  6. #6
    Membre chevronné
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Points : 1 944
    Points
    1 944
    Par défaut
    en gros je vais te donner un exemple bien simple tu as ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <math.h>
    #include <stdio.h>
     
    int main(void)
    {
       int a = 4;
       int b = 6;
       int ok = abs(a-b);
       printf("le nombre est toujours positif est c'est %d\n",ok);
     
     return 0;
    }
    quand tu fais
    tu auras la dite erreur car a la compilation le include dit que la fonction abs est bien dans math.h mais au linking il ne la trouve null part donc tu dois faire ceci:
    le lm c'est pour dire la librairies libm.so ou se trouve les fonctions declarer dans math.h, sous linux generalement dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /usr/libx ou/et /libx  avec x = '' ou x='64'
    si tu utilises une lib queconque ou que tu as deplacer les libs alors tu dois dire ou se trouve cette lib ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc main.c -o test -L /home/user/mylibs/ -lm
    Petit lien vers mon premier jeux SDL2/C
    http://store.steampowered.com/app/72..._Soul_Of_Mask/
    la suite? ca vient,ca vient!

  7. #7
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Citation Envoyé par lilington Voir le message
    tu auras la dite erreur car a la compilation le include dit que la fonction abs est bien dans math.h mais au linking il ne la trouve null part
    L'erreur survient effectivement durant l'édition de lien, mais elle n'est absolument pas liée au #include. D'ailleurs le code compilerait et l'édition de liens échouerait exactement de la même façon sans le #include.

  8. #8
    Membre chevronné
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Points : 1 944
    Points
    1 944
    Par défaut
    je n'ai jamais dit que c'etait lier au include.
    ce que je dit c'est que ne rapporte pas d'erreur car la fonction abs() est bien declarer dans math.h. en aucun moment je n'ai dit que le include etait lier a l'erreur.
    Petit lien vers mon premier jeux SDL2/C
    http://store.steampowered.com/app/72..._Soul_Of_Mask/
    la suite? ca vient,ca vient!

  9. #9
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Chez moi le "car" exprime la causalité, et causalité il n'y a pas. J'ai donc rectifié car ta phrase pouvait laisser supposer quelque chose de faux, indépendamment de ce que tu avais l'intention d'exprimer.

  10. #10
    Membre régulier Avatar de paragoge
    Profil pro
    Inscrit en
    Février 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 115
    Points : 71
    Points
    71
    Par défaut
    Citation Envoyé par lilington Voir le message
    quand tu fais
    tu auras la dite erreur
    J'ai utilisé ton exemple et je l'ai compilé comme tu l'as indiqué et je n'ai eu aucun message d'erreur.

    Par contre mon exemple initial ne peut encore être compilé. J'ai bien un dossier usr/lib64 mais il ne contient que le dossier libfakeroot.

    Dans home/user je n'ai pas de dossier mylibs

  11. #11
    Membre chevronné
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Points : 1 944
    Points
    1 944
    Par défaut
    oui j'ai compile comme j'ai dit et j'ai constater que depuis un certain temps libm n'a plus besoin d'etre appelle explicitement. je pense que ca doit etre les dernieres versions de gcc. donc quand tu utilises des fonctions de math.h c'est lie automatiquement maintenant.

    pour ton probleme c'est pour t'expliquer que il faut parfois(tres souvent meme) lier les choses manuellement.
    pour libfakeroot effectivement il y avait aucune chance de le trouver par defaut dans /usr/lib64 ou meme /lib car c'est une lib tiers, donc ou en l'installant elle y va ou alors elle est ailleur. montre le debut de ton code fait voire tous tes #includes et je te demanderai ou se trouve tel .h. histoire de voire ce que tu utilises. sinon tu peux aussi faire une recherche sur ton disque pour savoir ou se trouve quelquechose qui ressemble a libfakeroot puis tu feras:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc fichier.c -o executable -L /chemin/trouver/pour/repertoire/des/libs -lfaeroot
    Petit lien vers mon premier jeux SDL2/C
    http://store.steampowered.com/app/72..._Soul_Of_Mask/
    la suite? ca vient,ca vient!

Discussions similaires

  1. [compilation] undefined reference to
    Par Deallyra dans le forum Débuter
    Réponses: 6
    Dernier message: 13/11/2008, 11h41
  2. problème de compilation "undefined reference to"
    Par grabriel dans le forum Code::Blocks
    Réponses: 0
    Dernier message: 05/05/2008, 12h08
  3. Probleme de compilation (undefined reference to)
    Par Verbalinsurection dans le forum C++
    Réponses: 9
    Dernier message: 01/10/2007, 10h50
  4. [Compilation] undefined reference
    Par Valkirion dans le forum C++
    Réponses: 1
    Dernier message: 13/07/2007, 18h03
  5. Erreur compilation "undefined reference to "
    Par ViRouF dans le forum C++
    Réponses: 5
    Dernier message: 02/03/2007, 14h55

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