gpt4 book ai didi

linux - 为什么使用 sqrt 的程序在不指定数学库的情况下使用 gcc 进行编译

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:50:37 25 4
gpt4 key购买 nike

给定以下程序:

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

int
main(void)
{
double x = sqrt(2);
printf("The square root of two is %f\n", x);
return 0;
}

并编译:

gcc calc.c -o calc

成功了吗?为什么它不需要 -lm 或/usr/lib/blah/libm.so.x

用 ldd 检查二进制对象产生:

linux-vdso.so.1 (0x00007fff4f5e5000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007feeffd1b000)
/lib64/ld-linux-x86-64.so.2 (0x00007fef000e1000

没有引用 libm。但是,如果我使用 nm -D 查看 libc.so.6 库或 ld-linux-x86-64.so.2 库,这些库中没有 sqrt 函数。

这是怎么回事? gcc 是否神奇地包含了一组默认的常用函数或其他东西?

最佳答案

不,gcc 编译器知道 sqrt(2) 是一个常数值,只是在编译时计算该值。

要触发 sqrt() 库函数的使用,请使用如下代码:

volatile double y = 2;
double x = sqrt(y);

也可以使用 -ffreestanding gcc 选项,但不推荐这样做。

关于linux - 为什么使用 sqrt 的程序在不指定数学库的情况下使用 gcc 进行编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32898122/

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