编译器之间的 Qt DLL 兼容性

qt dll compatibility between compilers

本文关键字:DLL 兼容性 Qt 之间 编译器      更新时间:2023-10-16

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

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

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

我用依赖 walker 查看了 Qt dll,我看到有几十个导出的函数具有编译器名称重整。因此,似乎不可能使它们一起工作。

C++没有

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

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


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