【发布时间】:2013-10-29 19:09:20
【问题描述】:
我有一个使用 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。原来在这种情况下它成功了,但问题仍然存在。
【问题讨论】:
-
Qt 在次要版本中保持二进制兼容性,因此您应该能够将 MyDLL.dll 与 Qt 4.8.5 一起使用。你试过了吗?
-
我没有,实际上,你说得对,应该有二进制兼容性——这是 Qt 最棒的事情之一。我想我过分简化了我的问题。它完全让我感到困惑,Windows 不允许可执行文件指向特定的 DLL 子目录。
-
Windows 确实允许这样做。首先它在可执行文件的目录中搜索 DLL,然后是当前工作目录,然后依次搜索系统目录和 PATH(参见msdn.microsoft.com/en-us/library/vstudio/7d83bc18.aspx)。如果您需要覆盖 PATH 中的 DLL 版本,请将它们放在与可执行文件相同的目录中,或者在运行程序之前将当前工作目录设置为 DLL 所在的任何子目录(例如,在快捷方式中),但是您无论如何都不需要这样做。你会没事的,这里没有“DLL Hell”或其他任何事情。
-
在资源管理器 GUI 中,当您创建快捷方式时,如果您右键单击并选择“属性”,“启动目录”设置会指定初始工作目录。要自动执行此操作,这取决于您的安装程序(例如,Nullsoft 的 NSIS 安装程序系统具有创建应用程序快捷方式的命令,快捷方式的工作目录是参数之一)。可以通过编程方式创建快捷方式 (msdn.microsoft.com/en-us/library/windows/desktop/…),最简单的选择是使用您的安装程序。
-
但是,请注意,如果将 DLLs 放在可执行文件的目录中不够,并且您发现自己不得不对当前工作目录和 PATH 进行一些技巧,则可能存在一个更大的问题,您应该先退后一步检查。只有在非常奇怪或不幸的情况下,您才有理由将自动加载 DLL 放置在不寻常的地方。您使用 Qt 和您的自定义 DLL 描述的情况既不奇怪也不不幸。保持简单。
标签: c++ qt dll project-organization