【发布时间】:2008-09-19 16:21:31
【问题描述】:
在尝试调用 math.h 中的函数时,我收到如下链接错误
undefined reference to sqrt
但我正在做一个#include <math.h>
我正在使用 gcc 并编译如下:
gcc -Wall -D_GNU_SOURCE blah.c -o blah
为什么链接器找不到sqrt 的定义?
【问题讨论】:
在尝试调用 math.h 中的函数时,我收到如下链接错误
undefined reference to sqrt
但我正在做一个#include <math.h>
我正在使用 gcc 并编译如下:
gcc -Wall -D_GNU_SOURCE blah.c -o blah
为什么链接器找不到sqrt 的定义?
【问题讨论】:
调用 gcc 时在命令中添加 -lm:
gcc -Wall -D_GNU_SOURCE blah.c -o blah -lm
这将告诉链接器链接到数学库。包含 math.h 将告诉编译器存在诸如 sqrt() 之类的数学函数,但它们定义在单独的库中,链接器需要将其与可执行文件一起打包。
正如 FreeMemory 指出的那样,该库称为 libm.a 。在类 Unix 系统上,命名库的规则是 lib[blah].a 。然后,如果您想将它们链接到您的可执行文件,请使用 -l[blah] 。
【讨论】:
您需要明确链接数学库。将 -lm 添加到您传递给 gcc 的标志中,以便链接器知道链接 libm.a
【讨论】:
将-lm附加到gcc命令的末尾以链接数学库:
gcc -Wall -D_GNU_SOURCE blah.c -o blah -lm
要正确链接,编译器标志的顺序很重要!具体来说,-lm 应该放在at the end of the line。
如果您想知道为什么在用 C 编译时需要包含 math.h 库,请查看此解释 here。
【讨论】: