【问题标题】:On Windows MSVC, is it possible to merge some .obj into one .obj? If yes, how should I do that?在 Windows MSVC 上,是否可以将一些 .obj 合并为一个 .obj?如果是,我该怎么做?
【发布时间】:2020-12-07 17:44:00
【问题描述】:

例如,有三个目标文件a.obj b.obj c.obj刚刚用cl编译出来,希望将它们合并为一个combined.obj。

SO question 的评论指出,在 *nix 上,可以使用 ld 做这种事情。但是,cl 和link 似乎都只支持.exe、.dll 和.lib 作为输出。


我想对组合目标文件做的整个过程如下:

  1. a.obj b.obj c.obj->combined.obj
  2. combined.obj d.obj e.obj->executable.exe

我的问题解决了。 a.obj b.obj c.obj 使用了一些尚未链接的变量和函数,我认为.lib 不能容忍缺少的函数,因为它是一个库,但实际上没关系。我可以将它们合并到一个.lib 文件中:

lib *.obj /OUT:combined.lib

【问题讨论】:

  • 将它们放入 .lib 文件有什么问题吗?毕竟,它们的用途是:将目标代码收集到一个库中。
  • 可能有一个工具可用于合并目标文件。但是,一般来说,这就是对象 library 的用途。
  • @Aoyama 您可以将 any 目标代码填充到 .lib 文件中。外部依赖没有区别。最终,lib 的使用者将不得不通过提供仍然缺少的任何东西来完成它。一个 DLL,不同的故事,但一个常规的存档库实际上只是一个目标代码包。
  • @Aoyama 如果您最后的评论是关于进行链接时代码生成等的能力 - MSVC 可以使用对象库来做到这一点,如果你告诉它构建考虑到该选项的那些库。
  • 注意阿德里安所说的话。如果您希望使用 LTCG 构建发布版本,则需要确保您填充到 .lib 中的 obj 已充分配置为这样做。

标签: c windows visual-c++ linker


【解决方案1】:

好像没有,不过合并成.lib比较方便:

lib *.obj /OUT:combined.lib

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-12
    • 2017-11-15
    • 1970-01-01
    • 2017-09-18
    • 1970-01-01
    • 2020-08-02
    相关资源
    最近更新 更多