ImportError: DLL load failed with pybind11 and PCL

ImportError: DLL load failed with pybind11 and PCL

我正在使用 pybind11 为小型 C++ class 创建一个 Python 包装器 class。
导入 DLL 时出现以下错误(运行 python -v 以显示 Traceback):

>>> from a_py import *
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 657, in _load_unlocked
  File "<frozen importlib._bootstrap>", line 556, in module_from_spec
  File "<frozen importlib._bootstrap_external>", line 1101, in create_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
ImportError: DLL load failed while importing a_py: The specified module could not be found.

class 只有两个成员 - 来自 PCL 库的类型:

class A
{
   pcl::NormalEstimation< pcl::PointXYZ, pcl::Normal> normalEstimation_;
   pcl::PointCloud<pcl::Normal>::Ptr normals_;
};

如果删除 first 成员,我可以从 DLL 中成功导入模块。

这是 pybind11 代码:

namespace py = pybind11;

PYBIND11_MODULE(a_py, m)
{
   py::class_<A>(m, "A");
}

PCL 使用 CMake 找到:find_package(PCL REQUIRED)

最新的 PCL (1.10) 和旧版本 Windows 和 Linux 都会发生这种情况。

(在#includes 之前添加 #define PCL_NO_PRECOMPILE 没有帮助。)

更新: 我打开了 a GitHUb issue 关于这个,因为这看起来像是一个虚假的内部运行时依赖。

错误“找不到指定的模块”在 Windows 上有点误导,因为它意味着无法找到您尝试加载的 DLL 或其任何依赖项。

Windows 按照此处描述的顺序和路径搜索 DLL:https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order 但通常您只需确保您依赖的 DLL 与您正在加载的 DLL 位于同一文件夹中.

尝试在此工具(更现代的 DependencyWalker 版本)中打开您的 DLL:https://github.com/lucasg/Dependencies 并查找无法找到的 DLL。