编译时不需要链接C libm.a

时间:2016-07-27 05:19:08

标签: c gcc

我正在尝试编译包含<math.h>的源文件。 但是我成功创建了一个可执行文件,没有链接到libm.a就没有错误。

我输入的命令是gcc -Wall filename.c -o executablename

我被告知要链接到外部库(即/ libc.a以外的库)

发生了什么?

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

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

3 个答案:

答案 0 :(得分:2)

您调用的数学函数由编译器内置函数实现。如果要查看错误消息,请尝试以下操作:

gcc -fno-builtin -Wall filename.c -o executablename

例如,在我的平台(Ubuntu 14.04.3 LTS)上,我收到此错误消息:

$ cat x.c
#include <math.h>
#include <stdio.h>

int main(void)
{
    double x = sqrt(2.0);
    printf ("The sqrt of 2 is: %f\n", x);
    return 0;
}
$ gcc -fno-builtin x.c
/tmp/ccpjG2Pb.o: In function `main':
x.c:(.text+0x1c): undefined reference to `sqrt'
collect2: error: ld returned 1 exit status

答案 1 :(得分:0)

一些编译器,如OS X上的当前clang(伪装成gcc),不需要被告知将可执行文件与数学库链接。

OS X上的clang会将您的可执行文件与/usr/lib/libSystem.B.dylib链接起来(对于一个简单的程序,这只是这个)。该库反过来使用库/usr/lib/system/libsystem_m.dylib,它是数学库。

答案 2 :(得分:0)

<math.h>中的函数(或优先<tgmath.h>)是C库的一部分,就像许多其他函数一样。如果C库中的所有函数实际链接在一个库中,或者分别在多个块中链接,则它取决于平台。

在古代,库的大小是链接时间的问题,库越大,链接具有许多未解析符号的可执行文件所花费的时间就越长。这些时间早已过去,但在某些平台上分离为libc.alibm.a占优势。

如果您的平台不需要-lm进行链接,那么它应该具有libm.a的虚拟(空)版本,只要在您的链接命令行上没有错误就没有错误。例如,这是位于Alpine Linux基础的musl C库的情况。