2011-12-29 60 views
100

我试图让用C一个简单的计算器斐波纳契但是当编译gcc告诉我,我错过了战俘和地板的功能。怎么了?未定义参考`战俘“和'地板”

代码:

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

输出:

[email protected]:~/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 
+0

由于浮点精度不是无限的,这会给错误的答案为'N' – vonbrand 2013-01-20 05:14:04

回答

194

您需要具有标志-lm编译,就像这样:

gcc fib.c -lm -o fibo 

这会告诉GCC来链接代码数学库。只是一定要放标志后要链接的对象。

+6

能否请你解释如何制定出函后-l把没有那么大的价值? – 2011-12-29 20:12:16

+41

查看/ lib或/ usr/lib。这些库全部命名为'lib .a'或'lib .so' - 它是您在'-l'之后放置的“”。在这种情况下,数学库被命名为'libm.so',所以我们把它称为'-lm'。 – ams 2011-12-29 21:10:58

+3

谢谢!我一直在使用Google在过去的30分钟,这是第一参考提到对象后到库链接 – 2013-11-06 22:13:01

24

添加-lm到您的链接选项,因为POW()和地板()是数学库的一部分:

gcc fib.c -o fibo -lm 
6

要找到点在哪里添加-lm在Eclipse的IDE是真的太可怕了,所以我花了一些时间。

如果别人也使用Edlipse,这里是如何添加的命令方式:

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

8

在问候模糊提供了答案:

其实我有做一些稍微不同。

项目 - >属性 - > C/C++编译 - >设置 - > GCCÇ链接 - >库

点击小绿添加图标,M型和点击OK。因为它是一个库,所以这个窗口中的所有东西都会自动应用到它。

9

对于任何阅读后的好处,你需要对像弗雷德·林克说:

GCC fib.c -lm -o FIBO

一个很好的方法来找出你所需要的库链接是通过检查手册页,如果存在。例如,“人POW”和“男人底线”都将告诉你:

与-lm链接。