【问题标题】:Linking libraries in C [duplicate]C中的链接库[重复]
【发布时间】:2012-09-28 11:32:33
【问题描述】:

可能重复:
Why do you have to link the math library in C?

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

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

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

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

【问题讨论】:

    标签: c compilation linker static-libraries geany


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2019-03-13
        • 2019-04-28
        • 2017-11-01
        • 1970-01-01
        • 2014-10-27
        • 2017-01-12
        • 2014-08-11
        • 1970-01-01
        相关资源
        最近更新 更多