1

可能重复:
为什么必须在 C 中链接数学库?

我正在使用 GCC 编译器(在 Linux 上)学习 C。

我最近从 using Code::Blocks 转移到 using Geany,我注意到它Geany不会自动链接到任何所需的库。例如,当我#include <math.h>在 Code::Blocks 中使用时,它会在我编译时自动链接到相应的数学库中。但是,Geany不这样做,我必须手动添加构建命令,例如-lm数学库,以使编译工作。

但是,我注意到包含string.h标头并使用其中的函数可以很好地编译,而无需在字符串库中进行链接。这是为什么?是string.h标题本身定义了所有功能吗?有人可以解释为什么有些图书馆似乎需要链接,而另一些则不需要。

类似地,有没有人有经验告诉Geany自动链接所需的库?这将使编译变得容易得多。

4

2 回答 2

2

所有库都需要链接。但是,string.h标头中的库函数是 C 库的一部分,默认情况下链接到所有 C 程序,除非您另有要求。相比之下,数学库函数默认不链接,因为许多 C 程序不需要它们,而且链接器并不总是经过优化。

在古老的系统上,如果数学函数包含在 libc 中,那么编译所有程序会更慢,输出的可执行文件会更大,运行时需要更多的内存,这对大多数根本不使用这些数学函数的程序没有好处。这些天来,我们对共享库有很好的支持,即使是静态链接,标准库也被设置为可以丢弃未使用的代码,所以这些都不再是很好的理由了。
    --为什么一定要在 C 中链接数学库

于 2012-10-08T08:34:47.550 回答
1

在大多数系统上,只有数学库的函数被分成libm.soor libm.a(因为它很大)。其他头文件中声明的函数存在于libc.soorlibc.a中,它始终由 GCC(而不是 IDE!)自动链接。

但是,也有一些例外,因为 C 标准没有定义库的组织方式。在某些 linux 系统上,这些time_*函数被提取到一个单独的库librt.so(或 .a)中。在 Mac OS X 上,所有 C 标准库都libSystem.dylib与 CommonCrypto 和一些 BSD API(例如 libkern)一起放入。

于 2012-10-08T08:38:32.950 回答