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

1hdlvixo  于 2023-11-21  发布在  Windows
关注(0)|答案(2)|浏览(262)

例如,有三个目标文件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文件中:

  1. lib *.obj /OUT:combined.lib

字符串

liwlm1x9

liwlm1x91#

似乎不是,但将它们合并到.lib中是很方便的:

  1. lib *.obj /OUT:combined.lib

字符串

jrcvhitl

jrcvhitl2#

您 * 可以 * 将here使用的方法应用于cl.exe创建的COFF文件,* 前提是 * 您的ld版本支持相应的输入和输出格式,并且这些格式适合该过程。
在这种情况下,你可以这样做(是的,$INPUTS意味着你可以根据需要给予多个对象文件):

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

字符串
--oformat pe-x86-64(也称为AMD 64,Windows上的x64)是必要的,只要ld已经构建了不同的默认输出格式。
如果是这样的话,你 * 没有 * 给给予--oformat,你会得到这样的结果:

  1. 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所了解到的那样:

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

**注:**在这一点上,我没有运气得到这个工作与lld-linkld.lld(都可以通过现代VS版本),虽然。

附言:另一个需要注意的工具是Agner Fog的objconv,它是一个通用的性能优化工具(尽管它目前似乎没有实现这个确切的功能)。

展开查看全部

相关问题