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隐式链接。