【问题标题】:PySide DLL loading conflict within a C++ / Qt applicationC++/Qt 应用程序中的 PySide DLL 加载冲突
【发布时间】:2012-12-08 10:05:43
【问题描述】:

我有一个使用 Qt 4.x 的核心、GUI 和网络模块的 C++ 应用程序。它在用户执行某些操作时调用python回调,重点是用户可以通过编写python代码来自定义这些回调。

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

from PySide import QtNetwork

我收到以下错误

dll load failed : the specified procedure could not be found

请注意,我在导入 QtCore 和 QtGui 模块时不会收到错误消息。

我使用 dependency walker 试图找出问题所在。
当应用程序启动时,它会加载 QtCore4.dllQtGui4.dllQtNetwork4.dll,它们是放置在我的应用程序目录中的 C++ Qt DLL
当我触发对从 PySide 导入 QtNetwork 的 python 代码的回调时,它会加载 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++ DLL 而不是 PySide 的。我想那是因为他们的名字是一样的。
有没有办法让它加载正确的 DLL(c:\dev\python27\lib\site_package\pyside\ 目录中的那些)?
另外,为什么这种冲突与 QtCore 和 QtGui 无关?

【问题讨论】:

    标签: c++ python qt dll pyside


    【解决方案1】:

    首先,检查你的QTNETWORK4.DLL是否满足要求:

    • 适合您的架构
    • 与您的 Qt 库具有相同的版本,使用女巫编译您的程序
    • 由同一个编译器编译

    最好的方法是将你需要的库从 Qt 的 bin 目录复制到你的构建目录。

    所以,我认为这个冲突只与QTNETWORK4.DLL有关,因为这个库有其他版本(不满足上述要求)。

    让它加载正确的 DLL 的方法是添加到 Qt 的 bin 目录的 path 环境变量路径,并从你的程序目录中删除 DLL - 所以,它可以从path 找到所需的库。

    希望对你有帮助!

    【讨论】:

    • 我很确定网络 DLL 的版本不是这里的问题。我只安装和编译了一个 Qt 版本。另外,我使用的 DLL 已经是来自bin 目录的那个。我认为真正的问题是.PYD 应该从PySide 目录c:\dev\python27\...\pyside 加载DLL,而不是从应用程序目录加载DLL,也不是从我的Qt 目录的bin 文件夹加载DLL。即使在我的path 环境变量中使用 PySide 目录,.PYD 也不会加载 PySide DLL
    • 尝试从您的项目目录中删除QTNETWORK4.DLL,然后将c:\dev\python27\...\pyside 放在C:\Qt\bin 目录之前的path
    • 如果我的 PySide 目录在path 中我的Qt\bin 目录之前,当应用程序启动时,它会尝试加载 Python DLL 而不是 C++ 的,并会以一个条目退出点错误。
    • 好吧,我的错,你是对的。这是一个版本兼容性问题。 PySide 与 Qt 4.8.2 相关联,我使用 4.8.3 进行编译。我不知道这会产生如此大的不同。感谢您的帮助!
    • 很好,最好的问候,假期愉快! :)
    猜你喜欢
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多