J'essaie de faire une simple calculatrice de fibonacci en C mais lors de la compilation gcc
, cela me dit qu'il me 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));
}
Production:
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
c
gcc
undefined-reference
Gabriele Cirulli
la source
la source
n
Réponses:
Vous devez compiler avec l'indicateur de lien
-lm
, comme ceci:Cela indiquera à gcc de lier votre code à la bibliothèque mathématique. Assurez-vous simplement de placer le drapeau après les objets que vous souhaitez lier.
la source
lib<name>.a
oulib<name>.so
- c'est le "<nom>" que vous mettez après le-l
. Dans ce cas, la bibliothèque mathématique est nomméelibm.so
, nous l'appelons donc-lm
.Ajoutez -lm à vos options de lien, car pow () et floor () font partie de la bibliothèque mathématique:
la source
Pour le bénéfice de quiconque lira ceci plus tard, vous devez établir un lien avec cela comme Fred l'a dit:
Un bon moyen de savoir quelle bibliothèque vous devez lier est de vérifier la page de manuel s'il en existe une. Par exemple,
man pow
etman floor
vous diront tous les deux:Lien avec
-lm
.Une explication pour lier une bibliothèque mathématique en programmation C - Liaison en C
la source
En ce qui concerne la réponse fournie par Fuzzy:
Je devais en fait faire quelque chose de légèrement différent.
Projet -> Propriétés -> Construction C / C ++ -> Paramètres -> GCC C Linker -> Bibliothèques
Cliquez sur la petite icône verte d'ajout, tapez m et appuyez sur ok. Tout dans cette fenêtre est automatiquement appliqué à -l puisqu'il s'agit d'une bibliothèque.
la source
Trouver le point où ajouter le -lm dans Eclipse-IDE est vraiment horrible, donc cela m'a pris du temps.
Si quelqu'un d'autre utilise également Edlipse, voici comment ajouter la commande:
Projet -> Propriétés -> Construction C / C ++ -> Paramètres -> GCC C Linker -> Miscelleaneous -> Linker flags: dans ce champ, ajoutez la commande -lm
la source
Toutes les réponses ci-dessus sont incomplètes, le problème réside ici dans l'éditeur de liens
ld
plutôt que dans le compilateurcollect2: ld returned 1 exit status
. Lorsque vous compilez votrefib.c
objet to:Où
nm
répertorie les symboles du fichier objet. Vous pouvez voir que cela a été compilé sans erreur, maispow
,floor
et lesprintf
fonctions ont des références non définies, maintenant si je vais essayer de lier cela à l'exécutable:Im obtenir une sortie similaire que vous obtenez. Pour résoudre cela, je dois indiquer à l'éditeur de liens où chercher les références
pow
etfloor
, à cette fin, j'utiliserai l'-l
indicateur de l' éditeur de liens avecm
lequel provient de lalibm.so
bibliothèque.Vous pouvez maintenant voir, les fonctions
pow
,floor
sont liéesGLIBC_2.2.5
.L'ordre des paramètres est également important, à moins que votre système ne soit configuré pour utiliser des bibliothèques partagées par défaut, mon système ne l'est pas, donc lorsque j'émets:
Remarquez l'
-lm
indicateur avant le fichier objet. Donc, en conclusion, ajoutez un-lm
drapeau après tous les autres indicateurs et paramètres, pour être sûr.la source