首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我必须显式地链接到libm?

为什么我必须显式地链接到libm?
EN

Stack Overflow用户
提问于 2011-03-24 12:48:38
回答 3查看 21.9K关注 0票数 27

可能重复:

Why do you have to link the math library in C?

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

例如,当我想使用sin()函数时,我需要#include <math.h>,但也需要将-lm传递给GCC。但是对于标准库中的任何其他库,我不需要这样做。为什么会有区别?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-24 12:55:22

在过去,链接器速度很慢,将大部分未使用的数学代码与其他代码分离使得编译过程更快。今天的差别并不大,所以可以将-lm选项添加到默认的编译器配置中。

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

票数 31
EN

Stack Overflow用户

发布于 2011-03-24 13:45:34

这也是在大多数实现中必须显式链接到libpthread的原因。当一些新的和可怕的东西添加到标准库中时,它通常首先作为一个单独的外接程序库来实现,它用符合新需求的版本覆盖旧标准库实现中的一些符号,同时还添加了许多新的接口。如果一些历史实现在libm中有单独版本的浮点打印,而主libc中有一个"light“版本没有浮点,我就不会感到惊讶了。如果我没记错的话,这种实现实际上是在ISO C基本原理文档中提到和鼓励小型系统的。

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

票数 7
EN

Stack Overflow用户

发布于 2011-03-24 13:09:59

实际上,对于大多数数学函数来说,通常不需要链接到libm的原因是这些函数是由编译器内联的。您的程序将无法在平台上链接,而这不是这种情况。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5419366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档