未定义的引用`pow'和`floor'

Gab*_*lli 117 c gcc undefined-reference

我正在尝试在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));
}
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

Fre*_*red 228

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

gcc fib.c -lm -o fibo
Run Code Online (Sandbox Code Playgroud)

这将告诉gcc将您的代码与数学库链接.只需确保将标志放在要链接的对象之后.

  • 查看/ lib或/ usr/lib.这些库都被命名为`lib <name> .a`或`lib <name> .so` - 它是你在`-l`之后放的"<name>".在这种情况下,数学库名为`libm.so`,因此我们称之为`-lm`. (47认同)
  • 你能解释一下如何计算掉-l后的字母吗? (7认同)
  • 谢谢!我一直在谷歌搜索过去30分钟,这是第一个说在对象之后链接库的参考 (3认同)

Yan*_*aud 24

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

gcc fib.c -o fibo -lm
Run Code Online (Sandbox Code Playgroud)


spi*_*ett 9

为了以后阅读本文的任何人的利益,你需要链接它,因为弗雷德说:

gcc fib.c -lm -o fibo
Run Code Online (Sandbox Code Playgroud)

找出需要链接的库的一个好方法是检查手册页是否存在.例如,man pow并且man floor都会告诉你:

链接-lm.

关于在C编程中链接数学库的解释 - 在C中链接


小智 8

关于Fuzzy提供的答案:

我实际上必须做一些稍微不同的事情.

项目 - >属性 - > C/C++构建 - >设置 - > GCC C链接器 - >库

单击小绿色添加图标,键入m并单击确定.由于它是一个库,因此该窗口中的所有内容都会自动应用-l.


小智 6

要找到在Eclipse-IDE中添加-lm的地方真的太可怕了,所以我花了一些时间.

如果其他人也使用Edlipse,这里是添加命令的方法:

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