gpt4 book ai didi

c - gcc 在 mac OS X 上默认在 C 中链接数学库?

转载 作者:行者123 更新时间:2023-12-03 18:58:54 24 4
gpt4 key购买 nike

来自这个问题:Why do you have to link the math library in C?

我知道 C 数学库 (libm) 与 C 标准库 (libc) 分开,并且默认情况下未链接。

但是当我使用 gcc filename.c 编译下面的代码时没有 -lm在 mac osx 10.11.1 上
:

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

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

没有链接错误,输出可执行文件正常工作。

然后我尝试了 otool -L output :
output:
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1225.1.1)
/opt/local/lib/libgcc/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)

我想知道 mac 上是否存在一些库结构差异?

或者它是 gcc 5.2.0 的新功能?

非常感谢!

更新:

我改变了代码:
    double in = 0;
scanf("%lf", &in);
double x = sqrt(in);

它仍然不需要 -lm .

然后我用 otool -vVt 反汇编了代码:
(__TEXT,__text) section
_main:
0000000100000eed pushq %rbp
0000000100000eee movq %rsp, %rbp
0000000100000ef1 subq $0x10, %rsp
0000000100000ef5 pxor %xmm0, %xmm0
0000000100000ef9 movsd %xmm0, -0x10(%rbp)
0000000100000efe leaq -0x10(%rbp), %rax
0000000100000f02 movq %rax, %rsi
0000000100000f05 leaq 0x82(%rip), %rdi ## literal pool for: "%lf"
0000000100000f0c movl $0x0, %eax
0000000100000f11 callq 0x100000f54 ## symbol stub for: _scanf
0000000100000f16 movq -0x10(%rbp), %rax
0000000100000f1a movd %rax, %xmm0
0000000100000f1f callq 0x100000f5a ## symbol stub for: _sqrt
0000000100000f24 movd %xmm0, %rax
0000000100000f29 movq %rax, -0x8(%rbp)
0000000100000f2d movq -0x8(%rbp), %rax
0000000100000f31 movd %rax, %xmm0
0000000100000f36 leaq 0x55(%rip), %rdi ## literal pool for: "The square root of 2.0 is %f\n"
0000000100000f3d movl $0x1, %eax
0000000100000f42 callq 0x100000f4e ## symbol stub for: _printf
0000000100000f47 movl $0x0, %eax
0000000100000f4c leave
0000000100000f4d retq

好像 sqrt叫做。那么为什么 mac 上的情况会有所不同呢?

更新 :

我在这个问题中找到了结论: C std library don't appear to be linked in object file

它说 在 OS X 上,数学库是 libSystem 的一部分:
$ ls -l /usr/lib/libm.dylib
lrwxr-xr-x 1 root wheel 15 3 Jun 01:39 /usr/lib/libm.dylib@ -> libSystem.dylib

最佳答案

OSX 上没有单独的数学库。虽然许多系统在单独的数学库中的标准 C math.h 头文件中提供函数,但 OSX 不这样做,它是 libSystem 库的一部分,它总是被链接。

除此之外,如果编译器可以在编译时执行计算,它可能会优化掉任何此类调用。

关于c - gcc 在 mac OS X 上默认在 C 中链接数学库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33675638/

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