从 MinGW 静态库 (.a) 到 Visual Studio 静态库 (.lib)

Posted

技术标签:

【中文标题】从 MinGW 静态库 (.a) 到 Visual Studio 静态库 (.lib)【英文标题】:From MinGW static library (.a) to Visual Studio static library (.lib) 【发布时间】:2011-01-06 23:30:55 【问题描述】:

我正在尝试使用 xlsLib 从 C++ 应用程序创建 Excel 电子表格。

麻烦的是编译xlsLib,我给了一个.a文件(一个GCC静态库,由MinGW生成)。但是,我的应用程序依赖于另一个只能使用 Visual Studio 编译的 API (PhysX)。

因此:是否可以将 GCC 静态库 (xlslib.a) 转换为 Visual Studio 静态库文件 (xlslib.lib)?

【问题讨论】:

【参考方案1】:

使用 MinGW 生成的静态库存档通常与 Visual C++ 编译器/链接器兼容。因此,您应该能够通过将 .a 文件添加到 Visual Studio 中项目属性中的链接器输入来直接使用它们:

    转到项目Properties (Alt-F7)。 在左侧框,打开Configuration Properties->Linker->Input 添加您需要使用的所有.a 档案的列表 您可能还需要添加 MinGW 的 libgcc.a

此外,混合 C 运行时库properties of C/C++->Code Generation->Runtime Library 可能会出现问题,但这取决于您与 MinGW 一起使用的构建配置。有时需要链接到来自 MinGW 的 libmsvcrt.a,但在许多(如果不是大多数)情况下,它会导致问题。

最后,据我所知,这种混合的 MinGW 和 Visual C++ 链接通常适用于 C 模块,但不适用于 C++。

【讨论】:

但是使用.a会导致我的.exe无法调试“找不到调试信息”。 @onmyway133 检查调试符号是否仍然存在。您可以使用例如nm --debug-syms,如果二进制文件被剥离,它会说“没有符号”。 添加 libgcc.a 对我来说很重要 您说我可以使用MinGW64 生成静态库并将其用作MSVC 项目中的资源?【参考方案2】:

但使用 .a 会导致我的 .exe 无法调试“找不到调试信息”。 – 熵 5 月 22 日 12:27

这是因为 .a 库不包含调试所需的调试信息。如果你想调试它,你需要告诉编译器在编译时添加调试信息。对于mingw,您需要在运行“make”时将“-g”添加到CFLAGS,例如“make CFLAGS="-g"

【讨论】:

【参考方案3】:

以下是我发现有用的两个资源:

[截图,错误链接]

http://old.nabble.com/using-VC%2B%2B-.lib-with-mingw-td23151303.html

编辑。我找不到我要找的链接。同时,看看这个:http://www.willus.com/mingw/yongweiwu_stdcall.html

【讨论】:

【参考方案4】:

据我所知,它们是一回事。 Visual Studio 的.lib 文件也是包含目标文件的ar 档案。您是否尝试仅重命名文件? :)

【讨论】:

不,没那么简单,实际存档的格式略有不同。 相信Visual Studio自带的工具lib.exe也是有的。使用 .def 文件,您可以将 .a 转换为 .lib。

以上是关于从 MinGW 静态库 (.a) 到 Visual Studio 静态库 (.lib)的主要内容,如果未能解决你的问题,请参考以下文章

与 MinGW 的静态和动态/共享链接

如何使用 MinGW 在 Linux 上构建 Crypto++ 库?

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

CMake 使用其他静态库构建静态库

将 std::wstring 从 Visual Studio 移植到 mingw gcc

Msys2+mingw-w64 编译VS2013使用的ffmpeg静态库注意事项