使用 math.h 并链接对象文件而不使用 -lm

使用 math.h 并链接对象文件而不使用 -lm

我目前正在阅读高级 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.

相关内容