【问题标题】:Are libraries in C statically linked?C中的库是静态链接的吗?
【发布时间】:2016-03-16 15:03:28
【问题描述】:

我开始使用 Rust 编程,我注意到的第一件事是 Rust 会生成大型二进制文件。例如,Rust 的“Hello world!”二进制文件大小约为 600K,而等效的 C 二进制文件大小约为 8K。

经过一番搜索,我找到了this SO 帖子,它解释说 Rust 二进制文件很大,因为所有需要的库都是静态链接的。但是C不也是这样吗?当我用C写#include <stdio.h>时,我不是也静态链接了相关的I/O库吗?我一直认为答案是肯定的,但现在我开始怀疑自己了。

【问题讨论】:

  • 不,并非总是如此。通常-l 用于动态链接.so 文件。
  • 链接不同于头文件包含。 (#include <stdio.h> 不是链接命令/语句。)
  • 不,静态链接与动态链接是您选择的选项。
  • @callyalater #include 本质上不是将库复制并粘贴到源文件中吗?也许我很密集,但我看不出它不会静态链接库。
  • #include 将 文件内容 复制到源文件中,但如果标头只是函数声明,那么只需告诉程序这些函数是可在您的代码中调用。实际的实现可能在另一个文件中定义,该文件需要(静态或动态)链接到您的可执行文件。如果您查看 stdio.h 的标题,您会发现它只包含函数原型。

标签: c static-libraries


【解决方案1】:

#include 将 文件内容 复制到源文件中,但如果标头只是函数声明,那么所有要做的就是告诉程序可以调用这些函数你的代码。实际的实现可能在另一个文件中定义,该文件需要(静态或动态)链接到您的可执行文件。如果您查看 stdio.h 的标头,您会发现它只包含函数原型。

许多编译器都提供了对标准库进行静态或动态链接的选项。

【讨论】:

  • 谢谢。最后一个问题:我有一个使用一些 Boost 库的项目。有什么方法可以判断这些库是静态链接还是动态链接?
  • @AlessandroPower:如果您使用的是类 Unix 系统,请在可执行文件上运行 ldd。
  • @AlessandroPower boost 是仅标头库(需要一些特定部分)。因此,对于 boost 的大部分部分,不需要链接
  • 大多数 boost 库都是为 C++ 使用而设计的。因为他们倾向于为他们的类和函数使用模板,所以它们是“仅标头”库,只需要您在代码中包含 boost_header_file.hpp 文件。一些库(如regex、filesystems 和boost_threads)需要在使用前作为库进行预编译,但您可以将它们编译为静态库或动态库(我都做过)并相应地链接它们。
  • 你可以在Boost official website阅读更多关于哪些库需要预编译的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-17
  • 2015-12-31
  • 1970-01-01
  • 2010-12-14
  • 1970-01-01
相关资源
最近更新 更多