在 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 文件的最简单方法是啥?
如何在 Windows 上使用 Vim 编译 C++ 代码?