+ Répondre à la discussion
Affichage des résultats 1 à 12 sur 12
  1. #1
    Membre à l'essai
    Inscrit en
    avril 2010
    Messages
    124
    Détails du profil
    Informations forums :
    Inscription : avril 2010
    Messages : 124
    Points : 24
    Points
    24

    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 :
    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
    Responsable Modération
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    septembre 2007
    Messages
    5 516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : septembre 2007
    Messages : 5 516
    Points : 14 180
    Points
    14 180

    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 à l'essai
    Inscrit en
    avril 2010
    Messages
    124
    Détails du profil
    Informations forums :
    Inscription : avril 2010
    Messages : 124
    Points : 24
    Points
    24

    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
    Responsable Modération
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    septembre 2007
    Messages
    5 516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : septembre 2007
    Messages : 5 516
    Points : 14 180
    Points
    14 180

    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 à l'essai
    Inscrit en
    avril 2010
    Messages
    124
    Détails du profil
    Informations forums :
    Inscription : avril 2010
    Messages : 124
    Points : 24
    Points
    24

    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 à l'essai
    Inscrit en
    avril 2010
    Messages
    124
    Détails du profil
    Informations forums :
    Inscription : avril 2010
    Messages : 124
    Points : 24
    Points
    24

    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
    Responsable Modération
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    septembre 2007
    Messages
    5 516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : septembre 2007
    Messages : 5 516
    Points : 14 180
    Points
    14 180

    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 à l'essai
    Inscrit en
    avril 2010
    Messages
    124
    Détails du profil
    Informations forums :
    Inscription : avril 2010
    Messages : 124
    Points : 24
    Points
    24

    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
    Responsable Modération
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    septembre 2007
    Messages
    5 516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : septembre 2007
    Messages : 5 516
    Points : 14 180
    Points
    14 180

    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 à l'essai
    Inscrit en
    avril 2010
    Messages
    124
    Détails du profil
    Informations forums :
    Inscription : avril 2010
    Messages : 124
    Points : 24
    Points
    24

    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
    Profil pro
    Ingénieur systèmes embarqués
    Inscrit en
    juin 2009
    Messages
    2 762
    Détails du profil
    Informations personnelles :
    Âge : 27
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2009
    Messages : 2 762
    Points : 7 393
    Points
    7 393
    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
    Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseignez ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a

    Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^

    Pour vos problèmes d'embarqué, utilisez le forum dédié !

  12. #12
    Expert Confirmé Sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    24 349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France

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

    Informations forums :
    Inscription : septembre 2005
    Messages : 24 349
    Points : 34 764
    Points
    34 764

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •