虽然在库中组合多个目标文件是很常见的,但是(至少在Linux中)可以将多个目标文件组合到另一个目标文件中。
(见combine two GCC compiled .o object files into a third .o file)
由于使用库而不仅仅是组合目标文件存在缺点:
1:链接时只使用一种文件(对象)更容易,特别是如果所有文件都做同样的事情。
2:链接时(至少在GCC中),库(默认情况下)需要排序,不能处理循环依赖。
我想知道图书馆有什么优势(除了捕获22它们使用了很多)。
搜索了一段时间后,我得到的唯一解释似乎是单个库比多个目标文件更好。
答案 0 :(得分:10)
虽然它取决于所使用的链接器,但目标文件整体都包含在最终的二进制文件中。因此,如果将多个目标文件合并到一个目标文件中,则生成的(组合)目标文件将包含在生成的二进制文件中。
相比之下,库只是一个目标文件库。链接器将仅从库中提取它需要解析所有符号链接的目标文件。如果不需要目标文件(在库中),那么它不包含在二进制文件中。
答案 1 :(得分:5)
通常,库更好,因为链接器可以优化库中未使用的.o文件。
以某种方式组合文件也有一些优点:
答案 2 :(得分:1)
如果使用目标文件,则目标文件中的所有代码都将放在您的应用程序中。如果您使用库,则只需要所需的代码。
答案 3 :(得分:0)
一个原因是.a
库中的对象只会被拉入以满足 undefined 符号引用 - 所以如果你想允许调用应用程序定义一个符号,或使用“库”代码中的默认定义,可以使用真实库但不能使用单个.o
文件执行此操作。