首页 文章

gcc:为什么链接数学库需要-lm标志? [重复]

提问于
浏览
60

这个问题在这里已有答案:

我刚刚发现gcc需要 -lm 标志,以便编译一个从数学库中引用函数的程序 . 在编译包含其他库(如时间库)的程序时需要'm wondering why an explicit linking flag isn't . 如果我编写一个调用 time() 函数的程序,即使没有链接选项也会编译没有任何问题 . 但是如果没有 -lm 标志,那么涉及数学库的程序将无法工作 .

任何人都可以解释这种行为背后的原因吗?谢谢你的时间 .

2 回答

  • 32

    由于荒谬的历史实践,没有人愿意修复 . 将C和POSIX所需的所有功能整合到一个库文件中不仅可以避免一遍又一遍地询问这个问题,而且还可以在动态链接时节省大量的时间和内存,因为链接的每个 .so 文件都需要文件系统定位和查找它的操作,以及其静态变量,重定位等的几个页面 .

    所有函数都在一个库中的实现和 -lm-lpthread-lrt 等选项都是无操作(或链接到空 .a 文件)完全符合POSIX,当然更可取 .

    注意:我在谈论POSIX,因为C本身没有指定有关如何调用编译器的任何内容 . 因此,您可以将 gcc -std=c99 -lm 视为特定于实现的方式,必须为符合行为调用编译器 .

  • 63

    因为 time() 和其他一些函数在C库( libc )本身中定义 builtin ,并且GCC始终链接到libc,除非您使用 -ffreestanding 编译选项 . 但是数学函数存在于 libm 中,而gcc没有隐式链接 .

相关问题