QT发布版构建的DLL过程中出现入口点错误

20

我在Qt Creator中构建了一个应用程序,它使用CImg进行一些图像处理。当我在IDE内部运行它时,它可以正常运行,但如果我尝试从它的目录启动它,它就会抛出以下错误。

The procedure entry point ??4QString@@QAEAAV0@$$QAV0AAZ could not be located 
in the dynamic link library QtCore4.dll

一切迹象都表明安装了多个DLL版本。我发现我的Xilinx IDE使用Qt库,但涉及的DLL是相同版本。我不是一个软件专家,在这里感到困惑。

4个回答

19
即使库的版本相同,它们也可能不兼容。例如,它们可能使用不同的配置进行编译,如是否支持STL、OpenGL、SQL驱动程序等等。
修复这个问题最简单的方法是将Qt SDK的路径移动到环境变量PATH的开头。这样,每当运行需要Qt库的可执行文件时,它将加载随SDK一起提供的库(在PATH中找到的第一个库),除非已经在可执行文件的目录中存在QtCore4.dll、QtGui4.dll等副本。因此,如果你要重新分发你的应用程序,你可能还必须在其目录中提供这些库。
另一个选项是静态链接,但您将需要根据(L)GPL许可证提供源代码。

目录中有QtCore4.dll和QtGui4.dll的副本。这就是应用程序所需的全部内容了。静态链接也不起作用。我已经准备好将其退回给工程师,并告诉他处理命令行版本。 - Matt Young
@Matt 你的意思是把QtCore4.dll放在应用程序目录中,但仍然显示那个消息?可能是错误的DLL。也许你从QtCreator的目录中取出了DLL,但你应该从SDK中取出它们,因为它们不是相同的(而你的应用程序链接到后者)。 - Claudio
运行了Dependency Walker,并将dll文件重新复制到目录中。不确定最初使用的是哪些dll文件,但现在它可以工作了。 - Matt Young
谢谢,我的路径中有CMake二进制目录,并意识到通过“依赖项查看器”发现我的二进制文件正在加载那些dll,而不是我链接的那些dll。 - partyd
谢谢,你的建议对我很有帮助。另一个提示是使用类似于“whereis”或“which”的工具(我在Cygwin中有它们)来检查使用了哪些Qt文件。我从未想过Anaconda的bin文件夹包含windeployqt.exe!!! 将Qt目录置于Path的顶部。在重新安装Qt之前,这应该是操作清单中的必要步骤。 - Wuyue Lu

0

遇到了相同的问题[Windows 10, Qt5 + Mingw],即使在复制了所有必要的Qt5 .dll文件之后仍然出现了相同的错误。

DependencyWalker对我来说崩溃了,所以我通过复制文件进行尝试和错误的方法。

结果发现我还需要复制libstdc++-6.dll。

这表明可能除了Qt库之外,您还需要复制其他附加库。


0

静态链接库可以消除这个问题。


9
但是强制你在(L)GPL下发布。 - Claudio

0
使用DependencyWalker列出qtcore4.dll从哪里加载。 我遇到了同样的问题-DependencyWalker向我展示了qtcore4.dll是从c:\windows\system32加载的,但是在这个文件夹中没有qtcore4.dll。
注意:在Windows 7 64位上,c:\windows\SysWOW64被“映射”为c:\windows\system32。 在这个文件夹中,我找到了dll-我重命名了dll,问题得到了解决。
请参见此答案: Qt fresh Gui application crashes on startup, faulting at QtCore4.dll

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接