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 :

Ne trouve pas les fonctions math


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 54
    Points : 27
    Points
    27
    Par défaut Ne trouve pas les fonctions math
    Bonjour,

    J'utilise dans un programme les fonctions math habituelles, comme pow, par exemple. J'ai spécifié l'option -lm lors de la compilation, et mon programme ne sait pourtant pas compiler, les erreurs étant uniquement des ``undefined reference to `pow'''. Comment faire?

    J'ai bien la librairie math.h, dans /usr/include/. Que faire? Je suis sous Debian.

    Merci.

  2. #2
    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
    Bonjour,
    L'option -lm doit être spécifiée lors de l'édition de liens, pas la compilation.
    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.

  3. #3
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2005
    Messages : 147
    Points : 165
    Points
    165
    Par défaut
    Salut,

    Lors de l'édition de lien (et pas de la compilation comme l'a dit Medinoc, mais peut être fais-tu les deux en meme temps si ton programme tient en un seul fichier), tu rajoutes -lm à la fin de la ligne, après les sources. Par exemple :

    Pour compliler :
    Pour linker (et ainsi générer l'exécutable) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -Wall -o fichier fichier.o -lm
    Je ne sais pas exactement pourquoi parfois mettre le -lxxx avant le fichier objet fonctionne, mais dans le cas général il doit être placé après.

    Si ça ne résout pas ton problème hésite pas à raler d'abord (ça fait du bien parfois), puis à nous expliquer ce qui se passe après
    Avec les ordinateurs, 99% des bugs proviennent de l'interface chaise-clavier...

    Comment ça 1Km n'est pas égal à 1024m ???

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 54
    Points : 27
    Points
    27
    Par défaut
    C'est bien ce que j'ai fait et ça ne fonctionne pas.

  5. #5
    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
    As-tu bien mis le -lm à la fin? Sous gcc, l'ordre a son importance.
    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.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 54
    Points : 27
    Points
    27
    Par défaut
    Je m'étais (partiellement) trompé. À vrai dire, voilà ce qui se passe.

    D'abord, j'ai essayé avec mon makefile. Je l'ai écrit de la sorte.
    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
     
    CC=gcc
    CFLAGS=--std=c99 --pedantic -Wall -W -Wmissing-prototypes -g -lm
    LDFLAGS=-g
    SRC = $(wildcard *.c)
    OBJS = $(SRC:.c=.o)
    AOUT = prog
    all : $(AOUT) 
     
    prog : $(OBJS)
    	$(CC) $(LDFLAGS) -o $@ $^
    %.o : %.c
    	$(CC) $(CFLAGS) -o $@ -c $<
    clean :
    	@rm *.o
    cleaner : clean
    	@rm $(AOUT)
    En tapant alors make -B, j'ai bien les erreurs données précédemment.

    Sans utiliser de makefile, ça fonctionne, alors.

    Merci de me dire pourquoi, et de votre patience.

  7. #7
    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
    Je dirais créer une variable LIBS, déplacer -lm dedans, et la mettre à la fin de la commande d'édition de liens.
    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.

  8. #8
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2005
    Messages : 147
    Points : 165
    Points
    165
    Par défaut
    L'erreur est logique : tu n'utilises pas -lm quand tu link, puisqu'il est dans CFLAGS, mais pas dans LDFLAGS.

    Mets à jour les lignes de ton makefile avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CFLAGS= --std=c99 --pedantic -Wall -W -Wmissing-prototypes -g
    LDFLAGS= -g -lm
     
    prog : $(OBJS)
           $(CC) -o $@ $^ $(LDFLAGS)
    (attention, il faut remplacer les espaces par une tabulation avant $(CC) -o $@ $^ $(LDFLAGS) ).
    Avec les ordinateurs, 99% des bugs proviennent de l'interface chaise-clavier...

    Comment ça 1Km n'est pas égal à 1024m ???

  9. #9
    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
    Le problème, c'est que je ne sais pas s'il y a certains flags qui doivent être en premier dans la ligne de commande d'édition, c'est pourquoi j'avais fait deux variables séparées...
    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.

  10. #10
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2005
    Messages : 147
    Points : 165
    Points
    165
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Le problème, c'est que je ne sais pas s'il y a certains flags qui doivent être en premier dans la ligne de commande d'édition, c'est pourquoi j'avais fait deux variables séparées...
    Je ne sais pas non plus, j'ai testé sur mon ordi qui est un linux ubuntu 64bits avec gcc 4.2.4, et ça marche peu importe où je mets le -g et le -lm, mais le pire c'est que ça marche aussi sans le -lm, avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <stdio.h>
    #include <math.h>
     
    int main(void)
    {
      printf("PI = %f\n", 4*atan(1));
      return 0;
    }
    Je ne peux donc pas trop tester...
    Avec les ordinateurs, 99% des bugs proviennent de l'interface chaise-clavier...

    Comment ça 1Km n'est pas égal à 1024m ???

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 54
    Points : 27
    Points
    27
    Par défaut
    Merci, ça fonctionne! En effet, simple distraction.

    Merci!

  12. #12
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Il y a une utilite a ajuster le debut et la fin de la ligne de link. Pour info, la regle par defaut de GNU Make ressemble a ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       $(CC) $(LDFLAGS) $^ $(LOADLIBES) $(LDLIBS) -o $@
    et celle du make de Sun a ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       $(CC)  $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -o $@ $^ $(LDLIBS)
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 24
    Dernier message: 30/05/2007, 18h29
  2. [RSS] je ne trouve pas les flux.
    Par Maxoo dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 6
    Dernier message: 24/04/2006, 10h51
  3. [SGBD] ne trouve pas les libs mysql
    Par zinoh dans le forum Débuter
    Réponses: 2
    Dernier message: 14/04/2006, 16h17
  4. [Tomcat]Tomcat ne trouve pas les driver mysql
    Par Lash3r dans le forum Tomcat et TomEE
    Réponses: 4
    Dernier message: 06/01/2006, 01h12
  5. [FEDORA] Je ne trouve pas les fichiers includesous Feodra core 3 ?
    Par sali dans le forum RedHat / CentOS / Fedora
    Réponses: 4
    Dernier message: 22/10/2005, 23h30

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