将MinGW程序与MSVC静态库链接时出现警告 我有一个明W64 C++程序,我需要链接它作为一个对象文件(OBJ)提供的MSVC 64位静态C库。
我使用以下方法将其转换为.a:将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)只是一个对
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
生成的二进制文件,那么
您可以在没有警告的情况下链接到应用程序,然后尝试使用test.obj
:
g++ -shared -o test.dll test.obj
当您执行一次性步骤时,也会出现相同的联动警告,但如果不是这样的话
成功的话,test.dll
可以链接到您的应用程序,至少可以保证ABI兼容性,
因为它是一个DLL
这让我们回到了使用不同选项的编译选项。如果供应商将编译
test.obj
符合您的要求,然后要求供应商将其编译为DLL。对于Windows,
DLL是ABI兼容性的标准单位