从MinGW的.a文件转换为VC++的.lib文件

6
我有一个旧的 C++ 库,只能在 Windows 的 MinGW+MSYS32 上构建。从那里,我可以生成由 GNU libtool 生成的 .a 静态库文件。我的主要开发是在 Visual Studio 2008 中完成的。如果我尝试将 MinGW 生成的库链接到 Visual Studio 中,它会抱怨缺少外部引用。这很可能是由于所做的 C++ 符号名称重整,与 .a 文件中的内容不匹配。是否有任何已知的方法将静态 .a 文件转换为 VC++ 库格式?

不,你不能这样做。你需要在你想要使用的编译器中重新编译二进制文件以进行链接。 - Cody Gray
2个回答

8
如果符号混淆不同,编译器使用的是不同的ABI,并且您将无法“转换”或其他操作已编译的库:之所以名称以不同方式混淆是有意的,是为了避免用户从使用不同ABI的对象文件构建可执行文件。 ABI定义如何传递参数,如何表示虚拟函数表,如何抛出异常,基本数据类型的大小以及许多其他事项。名称混淆也是其中一部分,并且仔细选择以便在同一平台上与其他ABI不同和高效。检查名称混淆是否确实不同的最简单方法是使用两个编译器编译仅使用基本类型的几个函数的文件,并查看符号(在UNIX上,我会使用 nm 进行此操作;我不是Windows程序员,因此我不知道那里要使用什么工具)。
根据Wikipedia的描述,MinGW也使用不同的运行时库:MinGW所使用的标准C++库(libstdc++)和Visual Studio(Dinkumware)所使用的标准C++库的布局和实现不兼容。即使两个编译器之间的ABI相同,所使用的标准C++库也不同。如果ABI相同,则需要设置一种编译器使用另一个编译器的标准库的方法。已经编译好的库无法进行此操作。我不知道这是否可行。

就个人而言,我不会费力去尝试在这两个不同的编译器之间建立链接,因为它根本无法工作。相反,您需要将实现移植到一个共同的编译器,并从那里开始。


2
请注意,通常情况下,C代码可以在不同的编译器中使用。MinGW GCC可以链接到VC的.lib文件,但反之则不可行。 - rubenvb

3

搜索def文件并运行命令,例如lib /machine:i386 /def:test.def,它将生成一个导入库文件。


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