gcc:为什么需要-lm标志来链接math库?

我刚刚发现gcc需要-lm标志来编译引用math库函数的程序。 我想知道为什么在编译包含其他库(如时间库)的程序时不需要显式链接标志。 如果我编写了一个调用time()函数的程序,即使没有链接选项,也可以毫无问题地进行编译。 但是,如果没有-lm标志,涉及math库的程序就无法正常工作。

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

因为没有人愿意解决的荒谬的历史实践。 将C和POSIX所需的所有function合并到一个库文件中,不仅可以避免这个问题得到反复询问,而且在dynamic链接时也可以节省大量的时间和内存,因为链接的每个.so文件都需要文件系统操作来查找和find它,以及几个页面的静态variables,重定位等

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

注意:我在谈论POSIX,因为C本身并没有指定如何调用编译器。 因此,您可以将gcc -std=c99 -lm作为特定于实现的方式处理,因为编译器必须针对符合性行为进行调用。

由于time()和其他一些函数是在C库( libc )本身定义的builtin ,GCC 总是链接到libc, 除非你使用了-ffreestanding编译选项。 然而,math函数生活在libm ,而不是由gcc隐式链接。