【问题标题】:g++ partial linking instead of archives?g ++部分链接而不是档案?
【发布时间】:2010-09-21 05:20:26
【问题描述】:

我对 C++ 构建流程非常陌生,我正在考虑切换到对我的库使用部分链接,而不是创建 ar 档案。我希望在不可避免的最终编译步骤中减少链接时间,我认为部分链接一些库一次可以节省我在最后一步链接所有内容的时间。

我所描述的可能吗?我认为它应该类似于ld -Ur -o mylib.o [components]。是否有我没有考虑到的重要构建注意事项?

【问题讨论】:

    标签: c++ g++ linker


    【解决方案1】:

    您失去了将对象文件放在ar 存档中的一个重要影响,即只有引用的对象才会被链接。

    如果您在 ar 存档中同时拥有带有符号 foofoo.o 和带有符号 bar 的 bar.o,并且仅引用 foo 符号,则只有 foo.o 将链接到. 如果您改为使用部分链接,则两者的内容都将在可执行文件中结束,即使 bar 从未在任何地方引用。

    您也可以尝试更快的链接器,例如gold

    【讨论】:

    • 所以基本上可以预期可执行膨胀是更快链接的缺点,对吧?
    • 只有当你确实有对象,否则不会被链接到。如果你的库是你项目的一部分,你很有可能使用它的全部,因此不会有额外的膨胀. Linux 内核构建系统经常使用 ld -r,但只传递它知道将使用的 .o 文件。
    • 可以选择使用-ffunction-sections-fdata-sections-Wl,--gc-sections 在函数级别丢弃未使用的代码;见gcc.gnu.org/ml/gcc-help/2003-08/msg00128.html
    【解决方案2】:

    您想使用 ld -r 进行部分链接的其他时间是,如果您有一些包含静态初始化的目标文件,这些文件是提供某些功能所需的,但任何代码都不会直接调用。

    如果您愿意,我可以编写一份文档来展示其工作原理和原因!

    (例如,请参阅运行时 C++ 类注册,它使用静态注册函数将自身注册到注册表中,然后可以使用该函数创建并返回具有多态行为的 Base*,因为它创建了一个继承的新对象来自 Base。请参阅 C++ runtime knowledge of classes,这是我提出的问题的答案。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-23
      相关资源
      最近更新 更多