我正在尝试编译包含<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;
}
答案 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.a
和libm.a
占优势。
如果您的平台不需要-lm
进行链接,那么它应该具有libm.a
的虚拟(空)版本,只要在您的链接命令行上没有错误就没有错误。例如,这是位于Alpine Linux基础的musl C库的情况。