在 Windows MSVC 上,是否可以将一些 .obj 合并为一个 .obj?如果是,我应该怎么做?

On Windows MSVC, is it possible to merge some .obj into one .obj? If yes, how should I do that?

比如用cl编译出来的目标文件a.obj b.obj c.obj有3个,想合并成一个combined.obj.

一个 SO 问题的评论指出,在 *nix 上可以用 ld 做这种事情。然而,cllink似乎都只支持.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:

lib *.obj /OUT:combined.lib

可以将采用的方法here也应用于cl.exe创建的COFF文件,前提是 您的 ld 版本支持相应的输入和输出格式,并且这些格式适用于该过程。

在这种情况下你可以这样做(是的 $INPUTS 意味着你可以根据需要提供多个目标文件):

ld --oformat pe-x86-64 -r $INPUTS -o $OUTPUT

每当 ld 使用不同的默认输出格式构建时,--oformat pe-x86-64(又名 AMD64,Windows 上的 x64)是必需的。

如果是这样,而你没有给予--oformat,你会得到类似的东西:

ld: relocatable linking with relocations from format pe-x86-64 (input.obj) to format elf64-x86-64 (output.obj) is not supported

但是 该过程不适用于所有 input/output 格式组合,正如我在 Ubuntu 20.04 上使用 ld 2.34 了解到的那样:

ld: relocatable linking with relocations from format pe-i386 (input.obj) to format pe-i386 (output.obj) is not supported

注意: 在这一点上我没有运气让它与 lld-linkld.lld 一起工作(都可以通过现代 VS 版本获得),不过