【发布时间】:2011-09-08 17:49:37
【问题描述】:
虽然在一个库中组合多个目标文件是很常见的,但可以(至少在 Linux 中)将多个目标文件组合成另一个目标文件。
(见combine two GCC compiled .o object files into a third .o file)
因为使用库而不是仅仅组合目标文件也有缺点:
1:链接时只使用一种类型的文件(对象)会更容易,特别是如果所有文件都做同样的事情。
2:链接时(至少在GCC中),库(默认)需要排序,不能处理循环依赖。
我想知道图书馆有什么优势(除了第 22 条,它们被大量使用)。
搜索了一段时间后,我得到的唯一解释似乎是单个库比多个目标文件更好。
【问题讨论】:
-
首先您需要澄清“库”的含义。您是指共享对象(foo.so),还是在谈论档案(foo.a)? gcc 和 gnu ld 可以很好地处理 .a 文件的循环依赖关系,您只需多次指定每个 .a 文件。
-
@George "gnu ld 可以很好地处理 .a 文件的循环依赖关系,您只需多次指定每个 .a 文件" - 这是“很好”的有趣定义。
-
@Neil Butterworth 好吧,当多次指定每个库文件时,最好将所有符号视为多重定义。如果我没记错的话,这是处理 .a 文件之间循环依赖关系的“推荐”方法。
-
在 GCC 中,使用 -Wl,-(
-Wl,-) 使链接器重复循环通过 直到所有可以解析的所需符号都被解析。 (IIRC)
标签: c++ c linker object-files