如何编译使用从不同编译器编译的库的应用程序?

Posted

技术标签:

【中文标题】如何编译使用从不同编译器编译的库的应用程序?【英文标题】:How to compile an application that uses libraries compiled from different compilers? 【发布时间】:2018-09-22 12:38:14 【问题描述】:

我的问题是主题。

我目前在 Qt creator 中使用 Mingw32 编译器 来编译我的应用程序。问题是我在我的应用程序中包含了一个 .lib 静态库 和从 Visual Studio 2017 编译的头文件。

当我在 Qt 中进一步运行或编译我的应用程序时。我将面临错误代码,无法识别的文件格式指向 .lib 文件。

我有理由怀疑:例如,我不能使用编译器 1 编译从编译器 2 编译的其他库。

我按照这里的指令:libwdi Installation and Compilation 编译“libwdi.lib”文件。

仅供参考,我使用 Visual Studio 编译 .lib 库(libWdi)的原因是因为在我尝试使用 Qt5 工具中的wingw32-make 后,它更容易在我的 Windows 操作系统上实现。太痛苦了,因为我什至无法运行 ./autogen.sh 来为 Windows 上的 Mingw32 生成 makefile。

了解有关如何为 Qt 创建者构建可行的 .lib 文件的任何分步信息,包括使用 VS、mingw 和交叉编译器

【问题讨论】:

你不能。 C++ 名称修改不是标准化的,而是实现定义的,这意味着 C++ ABI 不能跨编译器移植,尤其是在涉及 Microsoft 时。话虽这么说,你的问题有点曲折,所以我不确定这是否是你所问的全部 对来到这里的人的建议:尝试使用 dll 包装器并使用所需库使用的相同编译器对其进行编译。至少你可以调用它,但是如果有很多东西需要包装,它仍然是一个痛苦。 【参考方案1】:

如果目标库在其公共接口中使用 c++ 功能,那么无论您经历什么诡计,这都可能无法正常工作。在这种情况下,即使是同一编译器的不同版本也经常会出现问题。

另一方面,纯 C 通常可以工作(在 Windows 上,非 MS 工具集将至少使用 MS 中间对象格式,即使编译器/链接器不正常使用)。

【讨论】:

如何查看源代码是纯c还是c++??如果它使用纯 c,我如何从源代码编译它? tks 别无选择,只能检查标头,特别是查找名称空间、类、模板和运算符重载。具有函数成员的结构不太可能但仍然可能。上述任何内容和库都使用 c++ 作为其公共接口的一部分。 Good 来源应通过头文件的扩展名来表明这一点——C 为.h,C++ 为.hpp(或类似名称)。不幸的是,甚至将 C++ 标头命名为 .h 也很常见,因此您不能真正依赖它。

以上是关于如何编译使用从不同编译器编译的库的应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

Windows下Memcached在.Net程序中的实际运用(从Memcached客户端Enyim的库的编译到实际项目运用) 转发

为啥在两台略有不同的机器上编译的库的行为略有不同?

如何在 Linux 中存储不同编译的相同库版本?

[Makefile应用] --- Makefile编译动态库并使用

通过编译函数库来学习GCC

编译的库的标题无法相互访问