在 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
做这种事情。然而,cl
和link
似乎都只支持.exe
、.dll
和.lib
作为输出。
我想对组合目标文件做的整个过程如下:
a.obj b.obj c.obj
->
combined.obj
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-link
或 ld.lld
一起工作(都可以通过现代 VS 版本获得),不过
比如用cl
编译出来的目标文件a.obj b.obj c.obj
有3个,想合并成一个combined.obj
.
一个 SO 问题的评论指出,在 *nix 上可以用 ld
做这种事情。然而,cl
和link
似乎都只支持.exe
、.dll
和.lib
作为输出。
我想对组合目标文件做的整个过程如下:
a.obj b.obj c.obj
->
combined.obj
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-link
或 ld.lld
一起工作(都可以通过现代 VS 版本获得),不过