将MinGW程序与MSVC静态库链接时出现警告 我有一个明W64 C++程序,我需要链接它作为一个对象文件(OBJ)提供的MSVC 64位静态C库。

将MinGW程序与MSVC静态库链接时出现警告 我有一个明W64 C++程序,我需要链接它作为一个对象文件(OBJ)提供的MSVC 64位静态C库。,c,visual-c++,mingw,static-linking,abi,C,Visual C++,Mingw,Static Linking,Abi,我使用以下方法将其转换为.a: ar rcs libtest.a test.obj 这在没有警告的情况下创建了静态库 当我链接程序时,我得到: 警告:def文件末尾的.drectve已损坏 但是链接的程序似乎运行良好(持续多长时间?) 我怎样才能摆脱这个警告?该库不是开源的,由商业供应商提供。如果需要的话,我可以让他用其他标志来编译它 我使用以下方法将其转换为.a: ar rcs libtest.a test.obj 实际上,这并不是以任何方式转换test.obj。静态库 (.a)只是一个对

我使用以下方法将其转换为.a:

ar rcs libtest.a test.obj
这在没有警告的情况下创建了静态库

当我链接程序时,我得到:

警告:def文件末尾的.drectve已损坏

但是链接的程序似乎运行良好(持续多长时间?)

我怎样才能摆脱这个警告?该库不是开源的,由商业供应商提供。如果需要的话,我可以让他用其他标志来编译它

我使用以下方法将其转换为.a:

ar rcs libtest.a test.obj
实际上,这并不是以任何方式转换
test.obj
。静态库 (
.a
)只是一个对象文件的归档文件加上一个目录 链接器可以通过它进行搜索

您的
ar
命令生成一个只包含
test.obj
的静态库。 如果您知道您的MinGW64链接需要
test.obj
没有 把它单独放在图书馆里是有意义的。链接器只需提取
test.obj
并将其添加到链接中,这样您也可以 直接链接
test.obj

如果这样做,MinGW64的GNU链接器将链接它并准确地发出 与从静态库链接时得到的警告相同。这 显示引发警告的内容在对象文件中,如下所示:-

PE对象文件格式提供了编译器通常使用的“abitrary information”部分 标签
.drectve
,用于嵌入它想要与链接器通信的指令, 如果可以的话,它会阅读并遵守它们

因此,MSVC使用了
.drectve
部分,并自然地在那里编写链接器指令,使 MS链接器的感觉,例如

Microsoft (R) COFF/PE Dumper Version 12.00.31101.0
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file hw.obj

File Type: COFF OBJECT

   Linker Directives
   -----------------
   /DEFAULTLIB:LIBCMT
   /DEFAULTLIB:OLDNAMES

  Summary

           C .data
          64 .debug$S
          2F .drectve
          12 .text$mn
它们对GNU链接器没有任何意义,因此它警告
.drectve
节已损坏

您能抑制该警告吗?

不,没有这样的选择

您能否让供应商以不同的方式编译
test.obj
来避免警告?

取决于MSVC生成的“corrupt”
.drectve
节的内容是什么(哪个 您可以使用
dumpbin
)发现,可能有一个MSVC编译器选项要禁止 这一代人。但以后会有更多

悬挂机构安全吗?

好吧,链接器认为对象文件已经损坏这一事实应该符合预期。 MinGW64并没有承诺您可以安全地将MSVC的对象文件链接到它自己的对象文件 或者根本没有。MSVC不承诺您可以将其对象文件与任何其他文件链接。Windows不调节系统的静态链接 不同编译器的目标文件。在实践中,您可以将 Test.Obj/<代码>链接到您的其他GCC C++应用程序中,因为 所有对象文件都是Windows COFF pe-x86-64对象文件,例如链接器能够 链接,并愉快地,<代码>测试。Obj/<代码>包含C,不是C++,符号,所以不兼容。 MS和GCC C++的名字不妨碍它。如果这个计划能奏效,那就是对未来的最大保证 这是你将要得到的安全

如果您真的想要更多的保证,或者只是想要一个由
test.obj
生成的二进制文件,那么 您可以在没有警告的情况下链接到应用程序,然后尝试使用
test.obj

    g++ -shared -o test.dll test.obj
当您执行一次性步骤时,也会出现相同的联动警告,但如果不是这样的话 成功的话,
test.dll
可以链接到您的应用程序,至少可以保证ABI兼容性, 因为它是一个DLL

这让我们回到了使用不同选项的编译选项。如果供应商将编译
test.obj
符合您的要求,然后要求供应商将其编译为DLL。对于Windows, DLL是ABI兼容性的标准单位