在Windows上使用MSVC,是否可以将一些.obj文件合并为一个.obj文件?如果可以,应该如何操作?

5
例如,有三个目标文件a.obj b.obj c.obj通过cl编译而出,想要将它们合并成一个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

2
把它们放在.lib文件中有什么问题吗?毕竟,这就是它们的作用:将目标代码收集到一个库中。 - WhozCraig
1
可能有一种工具可用于合并目标文件。但是,通常这就是对象的作用。 - Adrian Mole
1
@Aoyama,你可以将任何目标代码放入.lib文件中。外部依赖关系没有影响。最终,库的使用者必须通过提供任何仍然缺失的内容来完成它。DLL则不同,但常规存档库实际上只是一组目标代码的包。 - WhozCraig
2
如果@Aoyama的最后一个评论是关于能否进行链接时代码生成之类的功能 - MSVC 可以通过对象库来实现,只要你告诉它在考虑该选项时构建这些库即可。 - Adrian Mole
1
注意Adrian所说的话。如果你想使用LTCG进行发布构建,你需要确保你要放入.lib文件中的目标文件已经被充分配置。 - WhozCraig
显示剩余5条评论
2个回答

0

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

在这种情况下,您可以执行以下操作(是的,$INPUTS表示您可以按照您想要的方式提供多个目标文件):

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

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

如果是这种情况,并且您没有给出 --oformat,则会得到类似以下内容的结果:

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

然而,正如我在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

NB: 在这一点上,我尝试使用lld-linkld.lld(两者都可在现代VS版本中获得)都没有成功。


0

看起来不是,但将它们合并到一个.lib中很方便:

lib *.obj /OUT:combined.lib

这不是合并,而是打包。对象文件就像在基于GCC的工具链中使用ar一样简单地放置在存档中。您甚至可以使用诸如7-Zip和ar之类的工具解压MSVC生成的.lib文件。 - 0xC0000022L

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接