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

标签 c++ mingw msys

我有一个旧库(用 C++ 编写),我只能在 Windows 上的 MinGW+MSYS32 上构建它。由此我可以生成一个从 GNU libtool 生成的 .a 静态库文件。我的主要开发是在 Visual Studio 2008 中完成的。如果我尝试使用 MinGW 生成的库并将其链接到 Visual Studio 中,它会提示缺少外部组件。这很可能是由于已完成的 C++ 符号重整,并且它与 .a 文件中的内容不匹配。有什么已知的方法可以将静态 .a 文件转换为 VC++ 库格式吗?

最佳答案

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

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

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

关于c++ - 从 MinGW .a 转换为 VC++ .lib,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9346054/

相关文章:

c++ - 有没有更优雅/更聪明/更简洁的方法让未知数更接近 0?

c++ - 如何在 C++ 中遍历 LPBYTE 的每个字节

c++ - 彩虹表 : Unable to get last reduction

c - 根据编译器和声明遇到无限循环

c++ - 在 Windows 上玩 GCC 4.6

windows - Git for Windows (Git Bash) 中的包管理?

c++ - 成员函数指针c++

c++ - 如何让我的c++有setenv?

python - 在 32 位 msys 失败的 python 下安装 xgboost

windows - MSYS 错误 "rem: command not found"