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 de bibliothèque dans un code ultra-simple


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2010
    Messages : 124
    Points : 52
    Points
    52
    Par défaut Problème de bibliothèque dans un code ultra-simple
    Bonjour

    Travaillant habituellement avec codeblock, j'essaie de me remettre à la compilation en ligne de commande.
    J'ai un problème avec le code basique que je teste, qui, à l'execution, me retourne "undefined reference to `sqrt'". Serait-ce un problème de librairie ?

    Voici donc mon fichier main.c :
    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
    #include <math.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    int main()
    {
        int i;
        double n;
        printf("Hello world!\n");
     
        i=2;
        n=sqrt(i);
        printf("n=%e",n);
        return 0;
    }
    Mes commandes sont les suivantes :

    gcc -c main.c

    et

    gcc -o EXE -lm main.o (-lm pour avoir accès aux librairies mathématiques)

    Qu'est ce qui manque d'après vous ?

    Merci,
    L.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 368
    Points : 23 622
    Points
    23 622
    Par défaut
    Hello,

    C'est étrange. Ça devrait fonctionner en l'état et ça compile très bien chez moi avec les commandes que tu précises ici.

    De plus, est-ce vraiment à l'exécution ou seulement à la compilation que tu obtiens ce message ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2010
    Messages : 124
    Points : 52
    Points
    52
    Par défaut
    J'ai manqué de précision :
    c'est à la deuxième étape de compilation (c'est à dire : lors de gcc -o EXE -lm main.o), l'executable ne se créant pas.

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 368
    Points : 23 622
    Points
    23 622
    Par défaut
    Quelle version de GCC utilises-tu ? (avec gcc -v).

    Il se peut que l'ordre dans lequel tu passes tes paramètres influe. Essaie de déplacer -o EXE en fin de ligne puis, si ça ne fonctionne toujours pas, de faire passer -lm après main.o.

    D'autre part, tu n'es pas obligé de faire de la compilation séparée : tu peux directement écrire gcc main.c -lm -o EXE. Bien que cela ne résolve pas le problème ci-dessus, peux-tu nous dire si ça fonctionne de cette façon ?

    Enfin, il est possible que le compilateur ne voie pas par défaut les dépôts des bibliothèques concernées, mais ce serait très étonnant car il s'agit quand même des bibliothèques standard, voire même le minimum syndical exigible.

    — Avec quel système d'exploitation travailles-tu ?
    — Est-ce que tu obtiens d'autres messages d'erreur que celui signalé ?
    — Lorsque tu tapes alias dans ta ligne de commande, existe-t-il une ligne concernant gcc ?
    — Que donnent which gcc et ls -l `which gcc` ?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2010
    Messages : 124
    Points : 52
    Points
    52
    Par défaut
    c'est la version 4.7.2 de gcc que j'utilise.

    Je me lance tout de suite dans les tests que tu proposes...

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2010
    Messages : 124
    Points : 52
    Points
    52
    Par défaut
    ' gcc -lm main.o -o EXE ' --> ne marche pas

    gcc main.o -lm -o EXE --> OK !
    gcc -o EXE main.o -lm --> re OK !
    gcc main.c -lm -o EXE --> encore OK !!

    Bon, il semblerait que la version de gcc que j'ai n'accepte pas n'importe quel ordre de commande (ce qui est bizare parcequ j'avais recopié cet ordre sur un tuto..) Est-ce vraiment quelque chose de surprenant ?
    (pour info, mon OS est Linux sur Ubuntu 12.10 secure Remix.)

    L.

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 368
    Points : 23 622
    Points
    23 622
    Par défaut
    L'ordre dans lequel les bibliothèques (-l) est spécifié ainsi que celui des dépôts où le compilateur va les chercher (-L) a toujours influé. Voir : http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html

    Cependant, je m'étonne que ton compilo échoue dans certains cas puisque j'utilise la même version sans problème (sur une Fedora 18).

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2010
    Messages : 124
    Points : 52
    Points
    52
    Par défaut
    OK, je note l'adresse de ce site et je te remercie du tuyau (je n'aurais pas imaginé que ça ai une importance cet ordre de commande!)
    Peut être que cela dépend aussi de la version de gcc que nous utilisons respectivement.

    A+

  9. #9
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 368
    Points : 23 622
    Points
    23 622
    Par défaut
    Citation Envoyé par latitude38 Voir le message
    Peut être que cela dépend aussi de la version de gcc que nous utilisons respectivement. A+
    Comme dit juste au dessus, nous utilisons la même, d'où mes interrogations.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2010
    Messages : 124
    Points : 52
    Points
    52
    Par défaut
    mmm... A part la distribution d'OS, je ne vois pas ce qui change. Es tu aussi en 64 bits ?

  11. #11
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par latitude38 Voir le message
    ' gcc -lm main.o -o EXE ' --> ne marche pas

    gcc main.o -lm -o EXE --> OK !
    gcc -o EXE main.o -lm --> re OK !
    gcc main.c -lm -o EXE --> encore OK !!

    Bon, il semblerait que la version de gcc que j'ai n'accepte pas n'importe quel ordre de commande
    C'est cohérent avec ça :
    It makes a difference where in the command you write this option; the linker searches and processes libraries and object files in the order they are specified. Thus, `foo.o -lz bar.o' searches library `z' after file foo.o but before bar.o. If bar.o refers to functions in `z', those functions may not be loaded.
    Le may indique que ça pourrait marcher comme ça pourrait ne pas marcher. Tu as eu moins de chances que la personne ayant écrit le tuto

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Personnellement, je conjecturerais que la dernière phrase devrait être ceci:
    If bar.o refers to functions in `z' not referenced by foo.o, those functions will not be loaded.
    Même si c'est encore une sur-simplification, du fait qu'une bibliothèque soit un ensemble de fichiers .o et qu'un fichier .o puisse contenir plusieurs fonctions.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Problème try-catch dans mon code
    Par little pepito dans le forum Langage
    Réponses: 7
    Dernier message: 11/06/2007, 12h22
  2. Réponses: 16
    Dernier message: 18/10/2006, 22h52
  3. Probléme de transparence dans le code.
    Par Rifton007 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 16/07/2006, 20h40
  4. Problème de paramètres dans mon code javascript
    Par cocacollection dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 15/03/2006, 10h53
  5. Problème avec Between dans un code
    Par Sendo dans le forum Access
    Réponses: 4
    Dernier message: 02/10/2005, 18h44

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