Précédent   Forum du club des développeurs et IT Pro > C et C++ > C > Débuter
Débuter Forum d'entraide pour débuter en langage C. Avant de poster -> FAQ C
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 24/02/2013, 13h53   #1
latitude38
Futur Membre du Club
 
Inscription : avril 2010
Messages : 105
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 105
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.
latitude38 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2013, 14h48   #2
Obsidian
Modérateur
 
Avatar de Obsidian
 
Homme
Chercheur d'emploi
Inscription : septembre 2007
Messages : 4 614
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Essonne (Île de France)

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

Informations forums :
Inscription : septembre 2007
Messages : 4 614
Points : 11 095
Points : 11 095
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 ?
Obsidian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2013, 15h10   #3
latitude38
Futur Membre du Club
 
Inscription : avril 2010
Messages : 105
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 105
Points : 16
Points : 16
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.
latitude38 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2013, 16h05   #4
Obsidian
Modérateur
 
Avatar de Obsidian
 
Homme
Chercheur d'emploi
Inscription : septembre 2007
Messages : 4 614
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Essonne (Île de France)

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

Informations forums :
Inscription : septembre 2007
Messages : 4 614
Points : 11 095
Points : 11 095
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` ?
Obsidian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2013, 16h15   #5
latitude38
Futur Membre du Club
 
Inscription : avril 2010
Messages : 105
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 105
Points : 16
Points : 16
c'est la version 4.7.2 de gcc que j'utilise.

Je me lance tout de suite dans les tests que tu proposes...
latitude38 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2013, 16h22   #6
latitude38
Futur Membre du Club
 
Inscription : avril 2010
Messages : 105
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 105
Points : 16
Points : 16
' 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.
latitude38 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2013, 16h34   #7
Obsidian
Modérateur
 
Avatar de Obsidian
 
Homme
Chercheur d'emploi
Inscription : septembre 2007
Messages : 4 614
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Essonne (Île de France)

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

Informations forums :
Inscription : septembre 2007
Messages : 4 614
Points : 11 095
Points : 11 095
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).
Obsidian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2013, 16h41   #8
latitude38
Futur Membre du Club
 
Inscription : avril 2010
Messages : 105
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 105
Points : 16
Points : 16
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+
latitude38 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2013, 16h46   #9
Obsidian
Modérateur
 
Avatar de Obsidian
 
Homme
Chercheur d'emploi
Inscription : septembre 2007
Messages : 4 614
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Essonne (Île de France)

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

Informations forums :
Inscription : septembre 2007
Messages : 4 614
Points : 11 095
Points : 11 095
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.
Obsidian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2013, 17h09   #10
latitude38
Futur Membre du Club
 
Inscription : avril 2010
Messages : 105
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 105
Points : 16
Points : 16
mmm... A part la distribution d'OS, je ne vois pas ce qui change. Es tu aussi en 64 bits ?
latitude38 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2013, 17h14   #11
Bktero
Expert Confirmé Sénior
 
Avatar de Bktero
 
Ingénieur systèmes embarqués
Inscription : juin 2009
Messages : 1 699
Détails du profil
Informations personnelles :
Âge : 25
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 : 1 699
Points : 4 155
Points : 4 155
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 :
Citation:
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é !
Bktero est déconnecté   Envoyer un message privé Réponse avec citation 30
Vieux 25/02/2013, 10h06   #12
Médinoc
Expert Confirmé Sénior
 
Avatar de Médinoc
 
Homme
Développeur informatique
Inscription : septembre 2005
Messages : 22 384
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France

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

Informations forums :
Inscription : septembre 2005
Messages : 22 384
Points : 32 024
Points : 32 024
Envoyer un message via MSN à Médinoc
Personnellement, je conjecturerais que la dernière phrase devrait être ceci:
Citation:
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.
Médinoc est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 07h37.


 
 
 
 
Partenaires

Hébergement Web