1

我有一个使用 Qt 4.8.5 的 Qt 应用程序。此应用程序依赖于使用 Qt 4.6.0 构建的 DLL。我们称之为“MyDLL.dll”。

我无法重建 MyDLL.dll 以将其更新为 Qt 的更新版本。由于我的应用程序和 MyDLL 都需要 QtCore 和其他 DLL,并且版本不同,我如何组织我的文件以使它们不冲突?

MyDLL 在启动时是必需的,所以我不能使用任何延迟加载方法。

编辑:要清楚,这个问题出现是因为 MyDll.dll 是使用来自修改源的自定义 Qt 4.6.0 构建的,而我的应用程序使用的是 4.8.5 的自定义构建。两个版本的修改不一定相同,所以我不想假设我仍然可以使用 4.8.5 DLL。事实证明,在这种情况下它成功了,但问题是存在的。

4

3 回答 3

3

你不应该有任何问题。Qt 在次要版本和补丁版本上保持二进制兼容性(请参阅http://qt-project.org/wiki/Qt-Version-Compatibility),并且使用 4.6.x 构建的应用程序/DLL 在绑定到 4.8.x 运行时时可以正常运行。

  • 使用 4.6.0 构建的 MyDLL.dll 将与 4.8.5 运行时 DLL 一起运行。
  • 使用 4.8.5 构建的应用程序将使用 4.8.5 运行时 DLL 运行。
  • 只要您使用您一直使用的相同界面,您的应用程序就可以使用 MyDLL.dll 正常运行。

如果您遇到问题,那是因为其他原因,您需要明确说明您遇到了什么问题。

如果您没有发现问题并且只是先发制人地询问,那么 1) 照常进行,没有特殊考虑,并且 2) 您应该先尝试一下!

于 2013-10-29T19:36:07.577 回答
2

欢迎来到 DLL 地狱!:(

这在 Microsoft Windows 下是一个大问题,因为标准不是将版本信息构建到 DLL 文件名中(就像 Linux .so 文件一样)。

如果您直接链接到“MyDLL.dll”,您将无法完成您所追求的目标,因为它将寻找 QT DLL(如 QtCore、QtGui 等)。库存的 Qt DLL 在文件名中不包含版本修饰,因此在加载哪个版本时会有冲突。此外,您可能一开始就无法正确链接(由于冲突。Qt 不能很好地与旧版本配合使用)。

唯一的可能是创建一个单独的可执行文件,链接到 Qt 4.6.0 和 MyDLL,并在主应用程序和服务器之间使用一些进程外通信。COM 在这种情况下可能会起作用,但这在很大程度上取决于您的 dll 实际执行的操作。

唯一的其他做法是降级您的主应用程序并将其修复到 Qt 4.6.0。

于 2013-10-29T19:25:57.730 回答
0

Jason C 的回答是正确的。另请注意以下几点:

  1. MyDll.dll 必须使用与应用程序其余部分相同的编译器版本进行编译。

  2. 用于构建 MyDll.dll 的 Qt 版本应该与您当前使用的 Qt 版本具有相同的主要配置标志。Qt 命名空间、QThread 支持等东西都必须相同。

于 2013-10-30T00:15:35.903 回答