gcc连接器的奇异数值行为

时间:2017-09-12 08:41:08

标签: c gcc linker

我遇到的问题就像以下简单的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的新人。

1 个答案:

答案 0 :(得分:13)

我的 guess 是对于较小的数字,GCC编译器将exp调用优化为其他内容,但对于较大的数字,它需要数学库中的标准实现。数学库需要明确地与。链接。

通过在链接时添加选项-lm来链接数学库。它是选项-l(小写L),它告诉链接器链接到库,m用于 m ath库。

关于the exp function的可能优化,您可以使用较小的数字调用它,然后使用反汇编程序检查生成的代码。