编译器之间的 qt dll 兼容性

qt dll compatibility between compilers

Qt 库声明了跨主要版本的二进制兼容性。但是不同编译器之间的兼容性呢?

例如,我有一个应用程序和 2 个使用 Qt(动态链接)的 dll。但其中一个是用 MSVC 构建的,另一个是用 MinGW 构建的。因此它们链接到不同版本的 Qt 库(相同版本)。

问题是:这些 dll 是否可以使用一个共享的 Qt dll 一起工作? 如果不是,那么考虑到更改编译器不是一个选项,有哪些可行的解决方法?

我查看了带有 dependency walker 的 Qt dll,发现有数十个导出函数具有编译器特定的名称重整。所以好像不能让他们一起工作。

C++ 没有标准的 ABI。这意味着,包括 DLL 文件的二进制文件通常在编译器之间不兼容(它们甚至可能在同一编译器的不同构建选项之间不兼容......)。 MSVC 与 MinGW 就是这种情况,没有 DLL 兼容性。

普通 C 库在 Windows 上定义了 ABI,因此它们可以与任何编译器一起使用(即使 ABI 兼容,您仍然可能 运行 遇到具有不兼容依赖项的库的问题) .


如果重新编译一个库不是一种选择,那么我知道的唯一解决方法是拥有单独的进程,然后使用某种 IPC 机制进行通信。如果两个库都提供 GUI 元素,并且您想将它们混合在同一个 GUI 中,那是不可能的(或者至少很难,您需要在另一个应用程序的 window 中打开其他应用程序的 window,有点像叠加层)。