我目前正在阅读高级 Linux 编程,在第 2.3.3 节中据说如果我使用 math.h 中的某些函数,我必须使用 -lm 链接目标文件。但我非常确定我已经使用了一些数学函数,例如 sqrt、pow 或 log,而无需指定此共享库的使用。
你看出问题出在哪里了吗?
谢谢
答案1
如果您想保持代码/makefile 的可移植性,那么-lm
在使用函数时应该始终使用from 。math.h
该标头中的一些内容是宏(显然不需要额外的库),但未指定哪些内容(除了少数几个)。其他一些函数可能会由编译器实现为内置函数(甚至直接替换为特定于处理器的操作码)、内联函数等......因此代码的正确链接也可能取决于优化器设置和您的确切编译器/版本正在使用。
例如:
#include <stdio.h>
#include <math.h>
int main()
{
double d = 0.2;
fprintf(stdout, "%f\n", sqrt(d));
return 0;
}
在 Linux 上使用 GCC 4.5.1:
$ gcc -o t t.c
/tmp/cczCfJsj.o: In function `main':
t.c:(.text+0x30): undefined reference to `sqrt'
collect2: ld returned 1 exit status
$ gcc -O3 -o t t.c
# ok, compiled and linked fine
因此,为了避免让自己头痛,只需添加-lm
.