从 MinGW .a 转换为 VC++ .lib
Posted
技术标签:
【中文标题】从 MinGW .a 转换为 VC++ .lib【英文标题】:Convert from MinGW .a to VC++ .lib 【发布时间】:2012-02-19 02:12:14 【问题描述】:我有一个旧库(C++ 中),我只能在 Windows 上的 MinGW+MSYS32 上构建。从中我可以生成一个从 GNU libtool 生成的 .a 静态库文件。我的主要开发是在 Visual Studio 2008 中完成的。如果我尝试使用 MinGW 生成的库并将其链接到 Visual Studio,它会抱怨缺少外部。这很可能是由于已完成 C++ 符号修改,并且它与 .a 文件中的内容不匹配。有什么方法可以将静态 .a 文件转换为 VC++ 库格式吗?
【问题讨论】:
不,你不能这样做。您需要在要用于链接它的编译器中重新编译二进制文件。 【参考方案1】:如果符号以不同的方式修改,编译器使用不同的 ABI,您将无法“转换”或任何已编译的库:名称以不同方式修改的原因是有意避免用户成功使用使用不同的 ABI 从目标文件构建可执行文件。 ABI 定义了如何传递参数、如何表示虚函数表、如何抛出异常、基本数据类型的大小以及许多其他内容。名称 mangling 也是其中的一部分,并且经过精心挑选,以使其高效且与同一平台上的其他 ABI 不同。查看名称修饰是否确实不同的最简单方法是使用两个编译器仅使用基本类型来编译具有几个函数的文件并查看符号(在 UNIX 上,我将为此使用 nm
;我我不是 Windows 程序员,因此我不知道在那里使用什么工具)。
基于Wikipedia,MinGW 似乎也使用了不同的运行时库:MinGW (libstdc++) 和 Visual Studio (Dinkumware) 使用的标准 C++ 库的布局和实现不兼容.即使两个编译器之间的 ABI 相同,使用的标准 C++ 库也不同。如果 ABI 相同,则需要替换设置,以便一个编译器使用相应另一个编译器的标准库。没有办法用已经编译的库来做到这一点。不知道这是否可行。
就我个人而言,我不会费心尝试在这两个不同的编译器之间进行链接,因为它肯定根本不起作用。相反,您需要将实现移植到通用编译器并从那里开始。
【讨论】:
请注意,一般来说,C 代码可用于不同的编译器。 MinGW GCC 可以链接到 VC .lib 文件,但反过来是不可能的。【参考方案2】:搜索 def 文件并运行命令,例如lib /machine:i386 /def:test.def 它将生成 一个导入库文件。
【讨论】:
以上是关于从 MinGW .a 转换为 VC++ .lib的主要内容,如果未能解决你的问题,请参考以下文章
从 MinGW 静态库 (.a) 到 Visual Studio 静态库 (.lib)
cmake:让mingw(gcc)生成MSVC可用的dll(.lib)----mark亲测有效