对“pow”和“floor”的未定义引用

我想在C中做一个简单的斐波纳契计算器,但编译gcc告诉我我缺lesspow和floor函数。 怎么了?

码:

 #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)); } 

输出:

 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 

您需要使用标志-lm进行编译,如下所示:

 gcc fib.c -lm -o fibo 

这将告诉gcc链接你的代码与math库。 只要确保将标志放在要链接的对象之后

添加-lm到你的链接选项,因为pow()和floor()是math库的一部分:

 gcc fib.c -o fibo -lm 

为了以后读的人的利益,你需要像弗雷德说的那样反对它:

gcc fib.c -lm -o fibo

找出需要链接的库的一个好方法是检查手册页,如果存在的话。 例如,“man pow”和“man floor”都会告诉你:

与-lm链接。

关于Fuzzy提供的答案:

我实际上不得不做一些稍微不同的事情。

Project – > Properties – > C / C ++ Build – > Settings – > GCC C Linker – > Libraries

点击绿色的小图标,inputm并点击确定。 因为它是一个库,所以在这个窗口中的所有东西都会自动应用到它。

为了find在Eclipse-IDE中添加-lm的地方真的很糟糕,所以花了我一些时间。

如果其他人也使用Edlipse,下面是如何添加命令的方式:

项目 – >属性 – > C / C ++生成 – >设置 – > GCC C链接器 – > Miscelleaneous – >链接器标志:在此字段添加命令-lm