如何使用基于Qt的依赖关系组织Qt DLL

时间:2013-10-29 19:09:20

标签: c++ qt dll project-organization

我有一个使用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。原来它在这种情况下得到了解决,但问题就在于此。

3 个答案:

答案 0 :(得分: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。

答案 1 :(得分:2)

你不应该有任何问题。 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)你应该先尝试一下!

答案 2 :(得分:0)

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

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

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