为什么我必须明确地链接libm?

lin*_*lof 21 c gcc

可能重复:
为什么必须在C中链接数学库?

当我编写一个使用math.h库中函数的程序时,为什么我必须明确链接到它,libm即使它们是C标准库的一部分?

例如,当我想使用sin()我需要的功能#include <math.h>但我也需要传递-lm给GCC.但对于标准库中的任何其他库,我不必这样做.为什么不同?

pmg*_*pmg 18

在过去,链接器很慢,并且将大部分未使用的数学代码与其余代码分开,这使得编译过程变得更快.今天的差异并不大,因此您可以将-lm选项添加到默认编译器配置中.


请注意,标头<math.h>(或任何其他标头)不包含代码.它包含有关代码的信息,特别是如何调用函数.代码本身在库中.我的意思是,你的程序不使用" <math.h>库",它使用数学库并使用<math.h>标题中声明的原型.


R..*_*R.. 5

这是libpthread在大多数实现中必须显式链接到的原因。在标准库中添加了一些令人恐惧的新东西时,通常首先将其实现为单独的附加库,该附加库会覆盖旧的标准库实现中符合新要求的版本的某些符号,同时还会添加很多新界面。如果某些历史实现具有用于浮点打印的printfin的单独版本,libm而主要libc缺少浮点的“轻”版本,我不会感到惊讶。如果我没记错的话,ISO C基本原理文档中的微型系统实际上已经提到并鼓励这种实现。

当然,从长远来看,像这样将标准库分离出来会带来更多的问题,而不是收益。最糟糕的部分可能是增加了动态链接程序的加载时间和内存使用量。