从MinGW .a转换为VC ++ .lib

时间:2012-02-19 02:12:14

标签: c++ mingw msys

我有一个旧库(用C ++编写),我只能在Windows上使用MinGW + MSYS32。从那里我可以生成从GNU libtool生成的.a静态库文件。我的主要开发是在Visual Studio 2008中完成的。如果我尝试使用MinGW生成的库并在Visual Studio中链接它,它会抱怨缺少外部。这很可能是由于完成了C ++符号修改,并且它与.a文件中的whats不匹配。有没有什么方法可以将静态.a文件转换为VC ++库格式?

2 个答案:

答案 0 :(得分:5)

如果符号被不同地修改,编译器使用不同的ABI并且您将无法“转换”或编译库的任何内容:名称以不同方式损坏的原因是为了避免用户成功使用使用不同的ABI从目标文件构建可执行文件。 ABI定义了如何传递参数,如何表示虚函数表,如何抛出异常,基本数据类型的大小以及其他许多东西。名称mangling也是其中的一部分,并且经过精心挑选,以便在同一平台上高效且与其他ABI不同。查看名称修改是否确实不同的最简单方法是使用两个编译器仅使用基本类型编译具有几个函数的文件并查看符号(在UNIX上我会使用nm来实现此目的;我不是Windows程序员,因此我不知道在那里使用什么工具。

基于Wikipedia,似乎MinGW还使用了不同的运行时库:MinGW(libstdc++)和Visual Studio({{3)使用的标准C ++库的布局和实现}})不兼容。即使两个编译器之间的ABI相同,所使用的标准C ++库也不是。如果ABI是相同的,则需要替换设置,以便一个编译器使用相应其他编译器的标准库。使用已编译的库无法执行此操作。我不知道这是否可行。

就个人而言,我不打算尝试在这两个不同的编译器之间进行链接,因为它根本不会起作用。相反,您需要将实现移植到通用编译器并从那里开始。

答案 1 :(得分:2)

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

相关问题