我遇到的问题就像以下简单的C代码一样:
#include <math.h>
#include <stdio.h>
int main () {
printf ("%f\n", exp(1));
}
使用小于1
的数字替换710
会导致编译成功并产生预期效果,但对于高于此数字的数字,我会收到链接器错误:
/tmp/ccqVnsno.o: In function `main':
test.c:(.text+0x1c): undefined reference to `exp'
collect2: error: ld returned 1 exit status
我已使用以下bash脚本测试了1000以下的数字:
for i in {0..1000}; do
sed -i -r "s:[0-9]+:${i}:" test.c
gcc -o test test.c
./test
done
将printf
语句放在带有exp
索引变量的for循环中会导致相同的链接错误,无论上限如何。
这里发生了什么?编译器是否将710识别为long double
的某种限制?那么为什么链接器会捕获错误?抱歉轻信,我是C的新人。
答案 0 :(得分:13)
我的 guess 是对于较小的数字,GCC编译器将exp
调用优化为其他内容,但对于较大的数字,它需要数学库中的标准实现。数学库需要明确地与。链接。
通过在链接时添加选项-lm
来链接数学库。它是选项-l
(小写L),它告诉链接器链接到库,m
用于 m ath库。
关于the exp
function的可能优化,您可以使用较小的数字调用它,然后使用反汇编程序检查生成的代码。