9

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

(请参阅将两个 GCC 编译的 .o 目标文件合并到第三个 .o 文件中

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

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

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

我想知道图书馆有什么优势(除了第 22 条它们被大量使用)。

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

4

4 回答 4

10

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

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

于 2011-06-05T13:17:36.690 回答
5

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

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

  • 如果将所有源文件合并为一个,那么编译速度会大大提高。
  • 有时在 C++ 中,链接器可能会优化掉您不想优化的 .o 文件。例如,当您需要在此处定义但未在任何其他翻译单元中使用的对象的构造函数的副作用时。
于 2011-06-05T13:26:32.440 回答
1

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

于 2011-06-05T13:18:06.297 回答
0

一个原因是.a库中的对象只会被拉入以满足未定义的符号引用 - 因此,如果您希望允许调用应用程序定义符号的可能性,或者在“库”代码中使用默认定义,这是可能的使用真正的库而不是单个.o文件来执行此操作。

于 2011-06-05T14:09:09.117 回答