可能重复:
Why do you have to link the math library in C?
当我编写一个使用来自math.h库的函数的程序时,为什么我必须显式链接到libm,即使它们是C标准库的一部分?
例如,当我想使用sin()函数时,我需要#include <math.h>,但也需要将-lm传递给GCC。但是对于标准库中的任何其他库,我不需要这样做。为什么会有区别?
发布于 2011-03-24 12:55:22
在过去,链接器速度很慢,将大部分未使用的数学代码与其他代码分离使得编译过程更快。今天的差别并不大,所以可以将-lm选项添加到默认的编译器配置中。
注意,头<math.h> (或任何其他标头)不包含代码。它包含有关代码的信息,特别是如何调用函数。代码本身在一个库中。我的意思是,您的程序不使用"__<math.h>库“,它使用数学库,并使用<math.h>头中声明的原型。
发布于 2011-03-24 13:45:34
这也是在大多数实现中必须显式链接到libpthread的原因。当一些新的和可怕的东西添加到标准库中时,它通常首先作为一个单独的外接程序库来实现,它用符合新需求的版本覆盖旧标准库实现中的一些符号,同时还添加了许多新的接口。如果一些历史实现在libm中有单独版本的浮点打印,而主libc中有一个"light“版本没有浮点,我就不会感到惊讶了。如果我没记错的话,这种实现实际上是在ISO C基本原理文档中提到和鼓励小型系统的。
当然,从长远来看,像这样将标准库分离开来会带来更多的问题,而不是好处。最糟糕的部分可能是动态链接程序的加载时间和内存使用量的增加。
发布于 2011-03-24 13:09:59
实际上,对于大多数数学函数来说,通常不需要链接到libm的原因是这些函数是由编译器内联的。您的程序将无法在平台上链接,而这不是这种情况。
https://stackoverflow.com/questions/5419366
复制相似问题