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 381
    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 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Bonjour,
    L'option -lm doit être spécifiée lors de l'édition de liens, pas la compilation.

  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 : 37
    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

  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 381
    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 381
    Points : 41 582
    Points
    41 582
    Par défaut
    As-tu bien mis le -lm à la fin? Sous gcc, l'ordre a son importance.

  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 381
    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 381
    Points : 41 582
    Points
    41 582
    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.

  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 : 37
    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) ).

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 582
    Points
    41 582
    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...

  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 : 37
    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...

  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)

+ 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