我正在使用GCC编译器学习C(在Linux上)。
我最近从使用Code :: Blocks转到使用Geany
,我注意到Geany
不会自动链接到任何所需的库。例如,当我在Code :: Blocks中使用#include <math.h>
时,它会接受它并在编译时自动链接到相应的数学库中。但是,Geany
不会这样做,我必须手动添加构建命令,例如数学库的-lm
,以使编译工作。
但是,我注意到包含string.h
标头,并使用其中的函数,编译正常而不在字符串库中链接。这是为什么?是string.h
标题定义了所有函数本身吗?有人可以解释为什么有些图书馆似乎需要联系,而其他图书馆却没有。
在类似的说明中,是否有人有经验告诉Geany
自动链接所需的库?这将使编译更容易。
答案 0 :(得分:2)
所有库都需要链接。但是,string.h
标头中的库函数是C库的一部分,默认情况下链接到所有C程序,除非您另有要求。相比之下,默认情况下,数学库函数没有链接,因为许多C程序不需要它们,并且链接器并不总是被优化。
在古代系统中,如果数学函数包含在libc中,那么编译所有程序会更慢,输出可执行文件会更大,运行时需要更多内存,对大多数不使用这些数学函数的程序没有任何好处一点都不这些天我们对共享库有很好的支持,即使在静态链接时,也会设置标准库,以便可以丢弃未使用的代码,因此这些都不是很好的理由。
- Why do you have to link the math library in C
答案 1 :(得分:1)
在大多数系统中,只有数学库的功能分为libm.so
或libm.a
(因为它很大)。其他头文件中声明的函数存在于libc.so
或libc.a
中,它总是由GCC自动链接(而不是IDE!)。
但是,有一些例外,因为C标准没有定义如何组织库。在某些Linux系统上,time_*
函数被拉出到一个单独的库librt.so
(或.a)中。在Mac OS X上,所有C标准库与CommonCrypto和一些BSD API(例如libkern)一起放入libSystem.dylib
。