Référence non définie à "pow" et "floor"
j'essaie de faire une simple calculatrice fibonacci en C mais en compilant gcc
me dit que je manque les fonctions pow et floor. Quel est le problème?
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
5 réponses
vous devez compiler avec le drapeau de lien -lm
, comme ceci:
gcc fib.c -lm -o fibo
cela va dire à gcc de lier votre code avec la lib mathématique. Juste être sûr de mettre le drapeau après les objets que vous souhaitez lier.
Add-Lm à vos options de lien, puisque pow () et floor () font partie de la bibliothèque de mathématiques:
gcc fib.c -o fibo -lm
pour le bénéfice de quiconque lisant ceci plus tard, vous devez lier contre elle comme Fred a dit:
gcc fib.c -lm -o fibo
une bonne façon de savoir quelle bibliothèque vous devez créer un lien est de vérifier la page de manuel si une bibliothèque existe. Par exemple, man pow
et man floor
vous diront tous les deux:
lien avec -lm
.
Une explication pour la liaison de la bibliothèque math dans la programmation en C - la Liaison C
En ce qui concerne la réponse fournie par Flous:
en fait, j'ai dû faire quelque chose de légèrement différent.
Projet -> Propriétés -> C/C++ Build -> Paramètres -> GCC C Linker -> Bibliothèques
cliquez sur l'icône petit vert Ajouter, tapez m et appuyez sur ok. Tout dans cette fenêtre automatiquement a -l appliqué depuis c'est une bibliothèque.
pour trouver le point où ajouter le-lm dans Eclipse-IDE est vraiment horrible, donc ça m'a pris du temps.
si quelqu'un d'autre utilise aussi Edlipse, voici comment ajouter la commande:
Projet -> Propriétés -> C/C++ Build -> Paramètres -> GCC C Linker -> Miscelleaneous -> Linker drapeaux: dans ce champ d'ajouter la commande - "lm