C / C ++。库对组合对象文件的优势

时间:2011-06-05 13:10:02

标签: c++ c linker object-files

虽然在库中组合多个目标文件是很常见的,但是(至少在Linux中)可以将多个目标文件组合到另一个目标文件中。

(见combine two GCC compiled .o object files into a third .o file

由于使用库而不仅仅是组合目标文件存在缺点:

1:链接时只使用一种文件(对象)更容易,特别是如果所有文件都做同样的事情。

2:链接时(至少在GCC中),库(默认情况下)需要排序,不能处理循环依赖。

我想知道图书馆有什么优势(除了捕获22它们使用了很多)。

搜索了一段时间后,我得到的唯一解释似乎是单个库比多个目标文件更好。

4 个答案:

答案 0 :(得分:10)

虽然它取决于所使用的链接器,但目标文件整体都包含在最终的二进制文件中。因此,如果将多个目标文件合并到一个目标文件中,则生成的(组合)目标文件将包含在生成的二进制文件中。

相比之下,库只是一个目标文件库。链接器将仅从库中提取它需要解析所有符号链接的目标文件。如果不需要目标文件(在库中),那么它不包含在二进制文件中。

答案 1 :(得分:5)

通常,库更好,因为链接器可以优化库中未使用的.o文件。

以某种方式组合文件也有一些优点:

  • 如果将所有源文件合并为一个,则可以极大地提高编译速度。
  • 有时在C ++中,链接器可能会优化您不希望优化的.o文件。例如,当您需要在那里定义但未在任何其他翻译单元中使用的对象的构造函数的副作用时。

答案 2 :(得分:1)

如果使用目标文件,则目标文件中的所有代码都将放在您的应用程序中。如果您使用库,则只需要所需的代码。

答案 3 :(得分:0)

一个原因是.a库中的对象只会被拉入以满足 undefined 符号引用 - 所以如果你想允许调用应用程序定义一个符号,或使用“库”代码中的默认定义,可以使用真实库但不能使用单个.o文件执行此操作。