我有一个旧库(在 C++ 中),我只能在 Windows 上的 MinGW+MSYS32 上构建。从中我可以生成一个从 GNU libtool 生成的 .a 静态库文件。我的主要开发是在 Visual Studio 2008 中完成的。如果我尝试使用 MinGW 生成的库并将其链接到 Visual Studio,它会抱怨缺少外部。这很可能是由于已完成 C++ 符号修改,并且它与 .a 文件中的内容不匹配。有什么方法可以将静态 .a 文件转换为 VC++ 库格式吗?
2 回答
如果符号被不同地修改,编译器使用不同的 ABI,您将无法“转换”或任何已编译的库:名称以不同方式修改的原因是有意避免用户成功构建可执行文件来自使用不同 ABI 的目标文件。ABI 定义了如何传递参数、如何表示虚函数表、如何抛出异常、基本数据类型的大小以及许多其他内容。名称 mangling 也是其中的一部分,并且经过精心挑选,以使其高效且与同一平台上的其他 ABI 不同。查看名称修饰是否确实不同的最简单方法是使用两个编译器仅使用基本类型编译具有几个函数的文件并查看符号(在 UNIX 上我会使用nm
为了这; 我不是 Windows 程序员,因此我不知道在那里使用什么工具)。
根据维基百科,MinGW 似乎也使用了不同的运行时库:MinGW ( libstdc++ ) 和 Visual Studio ( Dinkumware ) 使用的标准 C++ 库的布局和实现不兼容。即使两个编译器之间的 ABI 相同,使用的标准 C++ 库也不同。如果 ABI 相同,则需要替换设置,以便一个编译器使用相应另一个编译器的标准库。没有办法用已经编译的库来做到这一点。我不知道这是否可行。
就我个人而言,我不会费心试图在这两个不同的编译器之间建立联系,因为它肯定根本不起作用。相反,您需要将实现移植到通用编译器并从那里开始。
搜索 def 文件并运行命令,例如 lib /machine:i386 /def:test.def 它将生成一个导入 lib 文件。