如果我在C程序中包含<stdlib.h><stdio.h>,我在编译时不必链接它们,但我必须链接到<math.h>,使用-lm和gcc,例如:

gcc test.c -o test -lm

原因是什么?为什么我必须显式链接数学库而不是其他库?

推荐答案

stdio.h中的函数都有libc.so中的实现(或者静电链接的libc.a中的实现),默认情况下链接到您的可执行文件中(就像指定了-lc一样).可以指示GCC避免与第-nostdlib-nodefaultlibs选项的这种自动链接.

math.h中的数学函数有libm.so中的实现(或者静电链接的libm.a中有libm.a中的实现),默认情况下,libm中没有链接.libm/libc的分裂是有历史原因的,但没有一个很有说服力.

有趣的是,C++运行时libstdc++需要libm,所以如果你用GCC(g++)编译C++程序,你会自动获得libm链接.

C++相关问答推荐

uintPtr_t上的算术

生成C代码时自动复制/生成' tmwtypes.h '依赖项

在x86汇编中,为什么当分子来自RDRAND时DIV会引发异常?

C:gcc返回多个错误定义,但msvc—不""'

标准的C17标准是用括号将参数包装在函数声明中吗

我应该如何解决我自己为iOS编译的xmlsec1库的问题?转换Ctx.first在xmlSecTransformCtxPrepare()之后为空

将常量转换为指针会增加.数据大小增加1000字节

Clang:如何强制运行时错误的崩溃/异常由于-fsanitize=undefined

使用C时,Windows CMD中的argc参数是否包含重定向命令?

如何在C中引发/处理自定义信号?

为什么cudaFree不需要数据 struct 的地址?

这个计算C中阶乘的函数正确吗?

如何用c语言修改shadow文件hash部分(编程)?

添加函数会 destruct 嵌入式C代码(无IDE)

C语言中浮点数的取整方式浮点数尾数超过23位时如何取整剩余部分

赋值两侧的后置增量,字符指针

Linux Posix消息队列

计算时出现奇怪的计算错误;N Select K;在C中

";错误:寄存器的使用无效;当使用-masm=intel;在gcc中,但在AT&;T模式

如何使用 raylib 显示数组中的图像