从这个问题:Why do you have to link the math library in C?
我知道C数学库(libm)与C标准库(libc)是分开的,默认情况下不链接到中。
但是当我在mac osx 10.11.1上使用gcc filename.c而不使用-lm编译下面的代码时
:

#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;
}

没有链接错误,输出可执行文件工作正常。
然后我试着:
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上的库结构有什么不同吗?
或者是GCC5.2.0的新特性?
谢谢!
更新
我把密码改成:
    double in = 0;
    scanf("%lf", &in);
    double x = sqrt(in);

它仍然不需要otool -L output
我用-lm反汇编代码:
(__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

似乎otool -vVt被调用了。那么为什么mac上的情况会不同呢?
更新
我发现这个问题的结论是:C std library don't appear to be linked in object file
在OSX上,数学库是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库的一部分,libSystem库总是链接在中。
除此之外,如果编译器能够在编译时执行计算,它可能会优化掉任何此类调用。

10-07 18:34