web-dev-qa-db-fra.com

Référence non définie à "pow" et "floor"

J'essaie de faire une simple calculatrice Fibonacci en C, mais lors de la compilation de gcc, il me dit que je manque les fonctions pow et floor. Qu'est-ce qui ne va pas?

Code:

#include <stdio.h>
#include <math.h>

int fibo(int n);

int main() {
        printf("Fib(4) = %d", fibo(4));
        return 0;
}

int fibo(int n) {
        double phi = 1.61803399;

        return (int)(floor((float)(pow(phi, n) / sqrt(5)) + .5f));
}

Sortie:

gab@testvm:~/work/c/fibo$ gcc fib.c -o fibo
/tmp/ccNSjm4q.o: In function `fibo':
fib.c:(.text+0x4a): undefined reference to `pow'
fib.c:(.text+0x68): undefined reference to `floor'
collect2: ld returned 1 exit status
111
Gabriele Cirulli

Vous devez compiler avec l'indicateur de lien -lm, comme ceci:

gcc fib.c -lm -o fibo

Cela indiquera à gcc de lier votre code à la bibliothèque mathématique. Assurez-vous simplement de mettre le drapeau after les objets que vous souhaitez lier.

222
Fred

Ajoutez -lm à vos options de liens, car pow () et floor () font partie de la bibliothèque mathématique:

gcc fib.c -o fibo -lm
24
Yann Droneaud

Pour le bénéfice de ceux qui liront cela plus tard, vous devez créer un lien comme le dit Fred:

gcc fib.c -lm -o fibo

Un bon moyen de déterminer la bibliothèque à lier est de consulter la page de manuel, le cas échéant. Par exemple, man pow et man floor vous diront tous les deux:

Lien avec -lm.

Une explication pour relier une bibliothèque mathématique en programmation C - Relier en C

9
spike.barnett

En ce qui concerne la réponse fournie par Fuzzy:

En réalité, je devais faire quelque chose de légèrement différent.

Projet -> Propriétés -> Génération C/C++ -> Paramètres -> Éditeur de liens C GCC -> Bibliothèques

Cliquez sur la petite icône d'ajout verte, tapez m et cliquez sur OK. -L est automatiquement appliqué à tout dans cette fenêtre puisqu'il s'agit d'une bibliothèque.

8
Greg K

Trouver le point où ajouter le -lm dans Eclipse-IDE est vraiment horrible, cela m'a donc pris un certain temps.

Si quelqu'un d'autre utilise également Edlipse, voici comment ajouter la commande:

Projet -> Propriétés -> Construction C/C++ -> Paramètres -> Éditeur de liens C GCC -> Divers -> Drapeaux de l'éditeur de liens: dans ce champ, ajoutez la commande -lm

6
Fuzzy