【问题标题】:Why does a program using sqrt compile with gcc without specifying a math library为什么使用 sqrt 的程序在不指定数学库的情况下使用 gcc 编译
【发布时间】:2015-12-30 03:07:10
【问题描述】:

给定以下程序:

#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 是否神奇地包含了一组默认的常用函数或其他内容?

【问题讨论】:

    标签: linux gcc libm


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-17
      • 1970-01-01
      • 2014-04-16
      • 1970-01-01
      • 2015-08-17
      • 2012-02-13
      • 1970-01-01
      相关资源
      最近更新 更多