Windows上的Qt DLL部署

Windows上的Qt DLL部署,windows,dll,manifest,Windows,Dll,Manifest,我有一个来自另一家公司的应用程序插件。我的插件使用Qt,所以它需要Qt DLL。我的问题是,所有版本的4.x Qt dll都被称为相同的,例如:QtCore4.dll。很有可能是其他插件或将自身插入PATH环境变量的其他应用程序将Qt DLL放入了applications文件夹中。在这种情况下,插件将不会启动,因为它需要不同版本的DLL 问题1。DLL部署的建议通用做法是什么 问题2。如果主机应用程序使用不同版本的Qt会怎么样。windows是否允许主机应用程序和插件使用不同的版本() 谢谢

我有一个来自另一家公司的应用程序插件。我的插件使用Qt,所以它需要Qt DLL。我的问题是,所有版本的4.x Qt dll都被称为相同的,例如:QtCore4.dll。很有可能是其他插件或将自身插入PATH环境变量的其他应用程序将Qt DLL放入了applications文件夹中。在这种情况下,插件将不会启动,因为它需要不同版本的DLL

  • 问题1。DLL部署的建议通用做法是什么
  • 问题2。如果主机应用程序使用不同版本的Qt会怎么样。windows是否允许主机应用程序和插件使用不同的版本()

谢谢

没有办法选择与Qt静态链接吗

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


但这并不能解决您的其他问题。

就像Tim说的那样,您应该将DLL部署在与正在制作的应用程序/插件相同的目录中。我相信PATH变量不是程序查找QT4 dll的第一个位置,因此,如果将其部署在同一文件夹中,应用程序将拾取与应用程序一起使用的文件,并忽略路径上的任何文件

问题1:在过去,似乎每个人都把DLL放在system32文件夹中,因为他们知道DLL在路径上,并且知道程序能够找到它。从用户的角度来看,当我想要卸载某些东西时,我发现这很难清理。现在,由于存储的价格很低,我想说的是,把你的DLL和你的应用程序放在一起,特别是如果它们是这样的,可能有多个版本。虽然我不是专家,但这就是我如何处理Java应用程序的jar文件


问题2:我想是的。这将取决于应用程序和插件的目录结构。你可以告诉你的插件使用哪个版本,我敢打赌应用程序的版本已经在一个特殊的地方了。

对于XP之后的Windows版本(即XP、2003、Vista、2008和Win7),你可以使用or。在这两种情况下,基本上您所做的是包含一个小文本文件,告诉操作系统您需要使用与可执行文件位于同一目录中的DLL的特定版本


这些都是鲜为人知的特性,但它们确实可以让你从“DLL地狱”中解脱出来。

A1:最佳实践:将DLL放在可执行文件的目录中。它将首先在那里查找DLL的加载。这是惯例

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

静态链接,您还必须考虑QT的许可限制。只要库在运行时被动态加载,并且可以与应用程序分离,LGPL就会感到高兴。这仅适用于不发布源代码等的情况


此外,您的安装程序应设置对这些文件的访问权限,以防止它们被其他恶意应用程序覆盖。

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

为了安全起见,您必须确保您的应用程序使用您希望它使用的dll版本。Windows保证首先查看应用程序文件夹。因此,您应该将所有二进制依赖项放在这里

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

现在,您应该临时删除(或重命名)已放入应用程序文件夹中的dll的一个接一个,每次都应该双击应用程序。如果Windows没有抱怨,它会在其他地方找到dll。从PATH环境中获取该dll(可能是暂时的)。Rapid Environment Editor是一个免费实用程序,可编辑立即生效的环境变量


只有当您确定应用程序使用了应用程序目录中的dll,并且没有从其他地方拉入任何dll时,才可以再次开始编辑PATH变量以恢复旧的情况

但是,如果两个不同的Qt版本的配置不同,它们就不兼容二进制文件。那么32位和64位版本的Qt DLL呢?并行缓存使得在大型网络中部署应用程序变得更加困难。我更喜欢简单的零安装、xcopy安装应用程序,在这些应用程序中,您只需复制exe和一些DLL,甚至不必复制它,只需将其保留在网络驱动器上即可。使用并排缓存DLL,您必须在每台电脑上显式安装应用程序。如果下一个版本需要新的DLL,则您还必须重新安装应用程序。据我所知,静态链接仅允许用于商业Qt许可证。LGPL许可证要求您允许您的客户使用新版本的Qt“重新链接”您的应用程序,这实际上意味着:放弃应用程序的源文件或对象文件。或将Qt作为DLL分发。