C++ / Qt 应用中 PySide DLL 加载冲突问题

3

我有一个使用Qt 4.x的Core、GUI和Network模块的C++应用程序。当用户执行某些操作时,它会调用Python回调函数,目的是让用户通过编写Python代码自定义这些回调函数。

当我尝试在回调函数中像这样导入PySide的QtNetwork模块时:

from PySide import QtNetwork

我遇到了以下错误:
dll load failed : the specified procedure could not be found
需要注意的是,当我导入QtCore和QtGui模块时,就不会出现这种错误。
我使用dependency walker尝试解决这个问题。当应用程序启动时,它会加载QtCore4.dll、QtGui4.dll和QtNetwork4.dll,这些都是放在我的应用程序目录中的C++ Qt DLLs。当我触发一个回调到我的python代码,导入来自PySide的QtNetwork时,它会加载QtNetwork.pyd,然后给我报错:
LoadLibraryExA("C:\Dev\Python27\lib\site-packages\PySide\QtNetwork.pyd", 0x00000000, LOAD_WITH_ALTERED_SEARCH_PATH) returned NULL. Error: the specified procedure could not be found (127).
我的QtNetwork.pyd的依赖树:(见图片)似乎表明它使用已经加载的C++ DLLs而不是PySide的DLLs,我猜这是因为它们的名称相同。有没有办法让它加载正确的DLL(即位于目录中的DLL)?还有,为什么QtCore和QtGui不会产生这样的冲突呢?
1个回答

1
首先,检查您的QTNETWORK4.DLL文件是否符合以下要求:
  • 适用于您的架构
  • 与您使用的编译程序编译程序时的Qt libs版本相同
  • 由相同的编译器编译
最好的方法是从Qt的bin目录复制所需的库到您的构建目录中。
因此,我认为这个冲突只涉及QTNETWORK4.DLL,因为该库有其他版本(不符合上述要求)。
使其正确加载DLL的方法是将Qt的bin目录路径添加到您的path环境变量中,并从程序目录中删除DLL文件--这样,它可以从path中找到所需的库。
希望它能帮助到您!

我很确定网络DLL的版本在这里不是问题。我只安装和编译了一个Qt版本。此外,我使用的DLL已经是bin目录中的DLL。 我认为真正的问题是.PYD应该从PySide目录c:\dev\python27\...\pyside加载DLL,而不是应用程序目录或Qt目录的bin文件夹中的DLL。 即使将PySide目录添加到我的path环境变量中,.PYD也不会加载PySide DLL。 - Guillaume Depardon
尝试从您的项目目录中删除 QTNETWORK4.DLL,并将您的 c:\dev\python27\...\pyside 放在 C:\Qt\bin 目录之前,加入到您的 path 中。 - tro
如果我的PySide目录在path中排在Qt\bin目录之前,当应用程序启动时,它将尝试加载Python DLLs而不是C++ DLLs,并以入口点错误退出。 - Guillaume Depardon
好的,我的错,你是对的。这是一个版本兼容性问题。PySide与Qt 4.8.2链接,而我在编译时使用的是4.8.3。我不知道这可能会有这样的影响。谢谢你的帮助! - Guillaume Depardon
很好,最好的祝福,祝你度过一个愉快的假期! :) - tro

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