在 Windows 上使用第三方 C++ 进行 pybind (ImportError: DLL load failed)

Posted

技术标签:

【中文标题】在 Windows 上使用第三方 C++ 进行 pybind (ImportError: DLL load failed)【英文标题】:pybind with third-party C++ on Windows (ImportError: DLL load failed) 【发布时间】:2021-03-16 04:17:20 【问题描述】:

我正在尝试使用 pybind11 从 python 中使用第三方 c++ 库。

我已经设法使用纯 C++ 代码做到了,但是,当我添加第三方代码时,我收到以下错误:

ImportError: DLL load failed while importing recfusionbind

这是我的代码:

#include <RecFusion.h>
#include <pybind11/pybind11.h>

using namespace RecFusion;

bool isValidLicense() 
    return RecFusionSDK::setLicenseFile("License.dat");


namespace py = pybind11;

PYBIND11_MODULE(recfusionbind, m) 
    m.def("isValidLicense", &isValidLicense, R"pbdoc(
        Check if there is a valid license file.
    )pbdoc");

#ifdef VERSION_INFO
    m.attr("__version__") = VERSION_INFO;
#else
    m.attr("__version__") = "dev";
#endif

如果我出于测试目的而更改,将函数返回为简单的true,它就可以正常工作。但是调用第三方库会出现上述错误。我已将 RecFusion.dll 放在当前目录(python 脚本所在的位置),结果相同。

欢迎任何关于我所缺少内容的提示。 Lib 是 64 位的,和我的代码一样。

【问题讨论】:

【参考方案1】:

在我看来,这像是一个链接问题。查看 您的 dll 的导入表(使用 PE 资源管理器或 IDA 等工具)。现在验证函数 RecFusionSDK::setLicenseFile 确实是从名为 RecFusion.dll 的 dll 导入的,而不是从其他 dll 名称导入的。

还要验证RecFusion.dll 的导出表和您的 dll 中的损坏函数名称是否匹配。如果不是,这可能是 ABI 问题。

【讨论】:

谢谢!事实证明,RecFusion.dll 需要其他几个 DLL 才能运行,而可执行文件夹中缺少一两个。

以上是关于在 Windows 上使用第三方 C++ 进行 pybind (ImportError: DLL load failed)的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 上使用 C++ 中的 Select 函数进行轮询

C++:在 Windows 上使用 C++ 读写 BMP 文件的最简单方法是啥?

C++经典绘图工具EasyX

如何在 Windows 上使用 Vim 编译 C++ 代码?

如何使用 C++ 在 Windows 中获取应用程序数据路径?

使用 C++ 在 Windows 上建立蓝牙连接(出现错误 10060)