我有一个来自其他公司的应用程序的插件。我的插件使用Qt所以它需要Qt DLL。我的问题是所有版本的4.x Qt Dll被称为相同,例如:QtCore4.dll。很可能某些其他插件或其他插入到PATH环境变量中的应用程序已将Qt dll放在applications文件夹中。在这种情况下,插件将无法启动,因为它需要不同版本的DLL。
谢谢!
答案 0 :(得分:3)
A1:最佳实践:将DLL放在可执行文件的目录中。它首先会在那里加载DLL。这是常见的做法。
A2:如果应用程序以某种方式使用不同版本的Qt,并且您所描述的模块需要更高版本或特定版本,则可能会导致问题(无法正常工作,崩溃等)。
使用静态链接,您还必须考虑Qt的许可限制。只要库在运行时动态加载并且可以与应用程序分离,LGPL就很高兴。这仅适用于您未发布源等的情况。
此外,您的安装程序应设置对这些文件的访问权限,以免被其他恶意应用程序覆盖。
答案 1 :(得分:3)
只是为了帮助其他人解决这个问题: 对于所有4.X版本,QT DLL保证相同(或至少是二进制兼容)。 (对于所有3.X版本等都相同)所以没有问题。这也是Qt dll命名中没有第二个数字的原因。
答案 2 :(得分:1)
自XP以来的Windows版本(即XP,2003,Vista,2008和Win7),您可以使用side-by-side assemblies或DLL redirection。在任何一种情况下,基本上你正在做的是包括一个小文本文件,它告诉操作系统你需要使用你在可执行文件所在目录中包含的特定版本的DLL。
这些是鲜为人知的功能,但它们可以真正保存你的“DLL Hell”屁股。
答案 3 :(得分:0)
有没有办法选择静态链接到Qt?
我会将DLL部署在与我的app / plugin相同的目录中。
但这并不能解决您的其他问题。
答案 4 :(得分:0)
就像蒂姆所说,你应该将DLL部署在与你正在制作的app / plugin相同的目录中。我相信PATH变量不是你的程序第一个寻找QT4 dll的位置,所以如果你将它部署在同一个文件夹中,你的应用程序会选择你的应用程序,并忽略PATH上的任何内容。
Q1:在过去,似乎每个人都将他们的DLL扔在system32文件夹中,因为他们知道它在PATH上,并且知道程序能够找到它。从用户的角度来看,当我想要卸载某些东西时,我发现很难清理。现在,随着存储的小价格,我会说你的应用程序保留你的DLL,特别是如果他们是这样的,可能有多个版本。虽然我不是专家,但我是如何处理Java应用程序的jar文件的。
Q2:我会这么认为。这取决于应用程序和插件的目录结构。您可以告诉您的插件使用哪个版本,我愿意打赌该应用程序的版本已经在特殊的地方。
答案 5 :(得分:0)
为了安全起见,您必须确保您的应用程序使用您希望它使用的dll版本。 Windows保证首先查看应用程序文件夹。所以你应该放置所有的二进制依赖项。
如果你在浏览器中双击它时你的应用程序没有运行,Windows会告诉你它需要什么dll。将该DLL复制到应用程序文件夹。如果您的应用程序运行,请转到下一步。
现在,您应该逐个删除(或重命名)已放入应用程序文件夹的dll,并且每次双击应用程序时。如果Windows没有抱怨它在其他地方找到了dll。从PATH环境中获取该DLL(可能是暂时的)。 Rapid Environment Editor是一个免费的实用程序,具有编辑环境变量,可立即生效。
只有当您确定应用程序使用应用程序目录中的dll并且不从其他地方提取任何dll时,您才可以再次开始编辑PATH变量以恢复旧情况。