gpt4 book ai didi

c - gcc 链接器的奇怪数值行为

转载 作者:太空狗 更新时间:2023-10-29 16:34:10 30 4
gpt4 key购买 nike

我遇到如下简单的 C 代码问题:

#include <math.h>
#include <stdio.h>

int main () {
printf ("%f\n", exp(1));
}

用小于 710 的数字替换 1 会导致编译成功并达到预期效果,但对于大于该数字的数字,我会收到所有链接器错误:

/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 的新手。

最佳答案

我的猜测是,对于较小的数字,GCC 编译器优化了 exp调用其他东西,但对于更大的数字,它需要数学库中的标准实现。数学库需要明确链接。

您可以通过在链接时添加选项 -lm 来链接数学库。选项 -l(小写的 L)告诉链接器链接一个库,m 表示 math 库。


关于 the exp function 的可能优化你可以用一个小数来调用它,然后用反汇编器检查生成的代码。

关于c - gcc 链接器的奇怪数值行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46171739/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com