Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 12 sur 12
  1. #1
    Futur Membre du Club
    Inscrit en
    avril 2010
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : avril 2010
    Messages : 108
    Points : 16
    Points
    16

    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
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    septembre 2007
    Messages
    5 370
    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 370
    Points : 12 579
    Points
    12 579

    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
    Futur Membre du Club
    Inscrit en
    avril 2010
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : avril 2010
    Messages : 108
    Points : 16
    Points
    16

    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
    Chercheur d'emploi
    Inscrit en
    septembre 2007
    Messages
    5 370
    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 370
    Points : 12 579
    Points
    12 579

    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
    Futur Membre du Club
    Inscrit en
    avril 2010
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : avril 2010
    Messages : 108
    Points : 16
    Points
    16

    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
    Futur Membre du Club
    Inscrit en
    avril 2010
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : avril 2010
    Messages : 108
    Points : 16
    Points
    16

    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
    Chercheur d'emploi
    Inscrit en
    septembre 2007
    Messages
    5 370
    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 370
    Points : 12 579
    Points
    12 579

    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
    Futur Membre du Club
    Inscrit en
    avril 2010
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : avril 2010
    Messages : 108
    Points : 16
    Points
    16

    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
    Chercheur d'emploi
    Inscrit en
    septembre 2007
    Messages
    5 370
    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 370
    Points : 12 579
    Points
    12 579

    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
    Futur Membre du Club
    Inscrit en
    avril 2010
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : avril 2010
    Messages : 108
    Points : 16
    Points
    16

    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 643
    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 643
    Points : 6 299
    Points
    6 299

    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 renseigner 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
    23 892
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France

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

    Informations forums :
    Inscription : septembre 2005
    Messages : 23 892
    Points : 31 879
    Points
    31 879

    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
  •