web-dev-qa-db-fra.com

référence indéfinie à sqrt (ou à d'autres fonctions mathématiques)

J'ai ce code simple:

max = (int) sqrt (number);

et dans l'en-tête, j'ai:

#include <math.h>

Mais l'application dit toujours référence non définie à sqrt. Voyez-vous un problème ici? Il semble que tout devrait bien se passer.

51
Waypoint

Vous constaterez peut-être que vous devez établir un lien avec les bibliothèques de mathématiques de n'importe quel système que vous utilisez, par exemple:

gcc -o myprog myprog.c -L/path/to/libs -lm
                                       ^^^ - this bit here.

L'inclusion d'en-têtes permet au compilateur de connaître les déclarations de fonction mais not n'est pas nécessairement lié au code requis pour exécuter cette fonction.

Sinon, vous devrez nous montrer votre code, votre commande de compilation et la plate-forme sur laquelle vous exécutez (système d'exploitation, compilateur, etc.).

Le code suivant compile et lie très bien:

#include <math.h>
int main (void) {
    int max = sqrt (9);
    return 0;
}

Sachez simplement que certains systèmes de compilation dépendent de l'ordre dans lequel les bibliothèques sont données sur la ligne de commande. J'entends par là qu'ils peuvent traiter les bibliothèques en séquence et les utiliser uniquement pour satisfaire les symboles non résolus à ce stade de la séquence.

Donc, par exemple, étant donné les commandes:

gcc -o plugh plugh.o -lxyzzy
gcc -o plugh -lxyzzy plugh.o

et plugh.o nécessite quelque chose de la bibliothèque xyzzy, la seconde peut ne pas fonctionner comme prévu. Au moment où vous listez la bibliothèque, il n’ya pas de symboles non résolus à satisfaire.

Et lorsque les symboles non résolus de plugh.odo apparaissent, il est trop tard.

83
paxdiablo

Je suppose que vous avez importé math.h avec #include <math.h>

Donc, la seule autre raison que je peux voir est un informations de liaison manquantes . Vous devez associer votre code avec l'option -lm.

Si vous essayez simplement de compiler un fichier avec gcc, ajoutez simplement -lm à votre ligne de commande, sinon, donnez des informations sur votre processus de construction.

23
krtek

Ajouter simplement le #include <math.h> dans le fichier source c et -lm dans le fichier Makefile à la fin fonctionnera pour moi.

    gcc -pthread -o p3 p3.c -lm
2
Hassan Rahman

J'avais le même problème, mais je l'ai simplement résolu en ajoutant -lm après la commande qui exécute mon code . Exemple. gcc code.c -lm

0
Mohamed Mnete