如果在C程序中包含了
<stdlib.h>
或<stdio.h>
,则编译时不需要链接这些库,但是必须使用-lm链接<math.h>
,例如使用GCC编译。gcc test.c -o test -lm
这是为什么?为什么我必须明确链接数学库,但不需要链接其他库?
<stdlib.h>
或<stdio.h>
,则编译时不需要链接这些库,但是必须使用-lm链接<math.h>
,例如使用GCC编译。gcc test.c -o test -lm
这是为什么?为什么我必须明确链接数学库,但不需要链接其他库?
stdio 是标准 C 库的一部分,默认情况下 GCC 会链接它。
数学函数实现在单独的 libm 文件中,不会默认链接,因此您需要指定它 -lm。顺便说一句,这些头文件和库文件之间没有关系。
stdio.h
和stdlib.h
的库都在libc.so
或libc.a
中实现,并且默认情况下由链接器链接。 libc.so
的库会在编译时自动链接并包含在可执行文件中。math.h
的实现在libm.so
或libm.a
中,与libc.so
分开。 它不会被默认链接,您必须在GCC中手动链接它,使用-lm标志编译程序。math.h
文件不会。请看这篇文章:为什么在GCC中要链接math.h?
看一下用法:
-lm
。#include <stdio.h>
#include <math.h>
int main() {
printf("output: %f\n", sqrt(2.0));
return 0;
}
gcc test.c -o test
此代码已在GCC 7.5.0(Ubuntu 16.04)和GCC 4.8.0(CentOS 7)上测试通过。
这里的文章提供了一些解释:
您调用的数学函数是由编译器内置函数实现的
另请参阅: