【发布时间】:2010-09-21 05:20:26
【问题描述】:
我对 C++ 构建流程非常陌生,我正在考虑切换到对我的库使用部分链接,而不是创建 ar 档案。我希望在不可避免的最终编译步骤中减少链接时间,我认为部分链接一些库一次可以节省我在最后一步链接所有内容的时间。
我所描述的可能吗?我认为它应该类似于ld -Ur -o mylib.o [components]。是否有我没有考虑到的重要构建注意事项?
【问题讨论】:
我对 C++ 构建流程非常陌生,我正在考虑切换到对我的库使用部分链接,而不是创建 ar 档案。我希望在不可避免的最终编译步骤中减少链接时间,我认为部分链接一些库一次可以节省我在最后一步链接所有内容的时间。
我所描述的可能吗?我认为它应该类似于ld -Ur -o mylib.o [components]。是否有我没有考虑到的重要构建注意事项?
【问题讨论】:
您失去了将对象文件放在ar 存档中的一个重要影响,即只有引用的对象才会被链接。
如果您在 ar 存档中同时拥有带有符号 foo 的 foo.o 和带有符号 bar 的 bar.o,并且仅引用 foo 符号,则只有 foo.o 将链接到. 如果您改为使用部分链接,则两者的内容都将在可执行文件中结束,即使 bar 从未在任何地方引用。
您也可以尝试更快的链接器,例如gold。
【讨论】:
-ffunction-sections 和-fdata-sections 和-Wl,--gc-sections 在函数级别丢弃未使用的代码;见gcc.gnu.org/ml/gcc-help/2003-08/msg00128.html
您想使用 ld -r 进行部分链接的其他时间是,如果您有一些包含静态初始化的目标文件,这些文件是提供某些功能所需的,但任何代码都不会直接调用。
如果您愿意,我可以编写一份文档来展示其工作原理和原因!
(例如,请参阅运行时 C++ 类注册,它使用静态注册函数将自身注册到注册表中,然后可以使用该函数创建并返回具有多态行为的 Base*,因为它创建了一个继承的新对象来自 Base。请参阅 C++ runtime knowledge of classes,这是我提出的问题的答案。)
【讨论】: