在Windows上Qt DLL部署

我有一个来自另一家公司的应用程序的插件。 我的插件使用Qt,所以它需要Qt DLL。 我的问题是所有版本的4.x Qt Dll被称为相同,例如:QtCore4.dll。 一些其他的插件,或者将自己插入到PATH环境variables中的其他应用程序很可能已经将Qt dll放到了应用程序文件夹中。 在这种情况下,插件将无法启动,因为它期望不同版本的DLL。

  • Q1。 build议的DLL部署的常见做法是什么?
  • Q2。 如果主机应用程序使用不同版本的Qt,该怎么办? Windows会允许主机应用程序和插件使用不同的版本()?

谢谢!

A1:最佳实践:把DLL放在可执行文件的目录下。 它会首先看到加载DLL。 这是常见的做法。

A2:如果应用程序使用不同版本的Qt,并且要描述的模块需要更高版本或特定版本,则可能会导致问题(不工作,崩溃等)。

通过静态链接,您还必须考虑Qt的许可限制。 只要库在运行时动态加载,并且可以与应用程序分离,LGPL就很高兴。 这只适用于你不释放你的源码等

另外,您的安装程序应该设置对这些文件的访问权限,以防止被其他流氓应用程序覆盖。

只是为了帮助其他人解决这个问题:所有4.X版本的QT DLL保证是相同的(或至少是二进制兼容的)。 (所有3.X版本都是一样的),所以不会有问题。 这也是Qt dll中没有第二个数字的原因。

对于XP以来的版本(即XP,2003,Vista,2008和Win7),您可以使用并行程序集或DLL重定向 。 在这两种情况下,基本上你在做什么是包括一个小的文本文件,告诉操作系统,你需要使用与可执行文件相同的目录中包含的特定版本的DLL。

这些是鲜为人知的功能,但它们可以真正保存你的“DLL地狱”的屁股。

有没有办法选择静态链接到Qt?

我将部署在我的应用程序/插件相同的目录中的DLL。

这不能回答你的其他问题。

像Tim说的那样,你应该把DLL部署在你制作的应用程序/插件所在的目录中。 我相信PATH变量不是您的程序将查找QT4 dll的第一个地方,因此,如果您将其部署到相同的文件夹中,您的应用程序将使用您的应用程序选取一个,并忽略PATH上的任何内容。

Q1:过去好像每个人都把他们的DLL放在system32文件夹里,因为他们知道它在PATH上,知道程序能够找到它。 从用户的角度来看,当我想卸载一些东西的时候,我觉得很难清理。 而现在,以小的存储价格,我会说保持您的DLL与您的应用程序,尤其是如果他们是这样的地方可能有多个版本。 虽然我不是专家,但我是如何处理Java应用程序的jar文件的。

Q2:我会这样想的。 这将取决于应用程序和插件的目录结构。 你可以告诉你的插件使用哪个版本,我愿意打赌应用程序已经在一个特殊的地方版本。

为了安全起见,您必须确保您的应用程序使用您希望使用的dll版本。 Windows保证先查看应用程序文件夹。 所以你应该把所有的二进制依赖关系。

如果你的应用程序不能运行,当你在资源管理器中双击它时,Windows会告诉你它需要什么。 将该dll复制到应用程序文件夹。 如果您的应用程序运行,请转到下一步。

现在你应该暂时删除(或重命名)你已经放在应用程序文件夹中的DLL,每次你应该双击你的应用程序。 如果Windows不抱怨它找到其他地方的DLL。 从PATH环境中获取该dll(可能是暂时的)。 快速环境编辑器是一个免费的实用程序,编辑环境变量立即生效。

只有当你确定你的应用程序在应用程序目录中使用了dll,并且没有从别的地方引入任何dll的时候,你可以再次编辑PATH变量来恢复旧的情况。