ImportError: сбой загрузки DLL с pybind11 и PCL - PullRequest
3 голосов
/ 22 апреля 2020

Я использую pybind11 для создания оболочки Python для небольшого класса C ++.
При импорте DLL появляется следующая ошибка (при запуске python -v для отображения трассировки):

>>> 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.

В классе всего два члена - типы из библиотеки PCL:

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

Если я удаляю first member, я могу успешно импортировать модуль из DLL.

Это код pybind11:

namespace py = pybind11;

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

PCL найден с использованием CMake: find_package(PCL REQUIRED)

Это происходит как на Windows, так и на Linux с последней PCL (1.10) и более ранние версии тоже.

(Добавление #define PCL_NO_PRECOMPILE до #includes не помогает.)

Обновление: Я открыл a GitHUb вопрос об этом, поскольку это похоже на ложную внутреннюю зависимость времени выполнения.

1 Ответ

2 голосов
/ 22 апреля 2020

Ошибка «Указанный модуль не найден» немного вводит в заблуждение на Windows, поскольку означает, что либо DLL, которую вы пытаетесь загрузить, либо какая-либо из ее зависимостей не может быть найдена.

Windows ищет DLL в порядке и путях, описанных здесь: https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order, но обычно вам нужно просто убедиться, что библиотеки DLL, от которых вы зависите, находятся в той же папке, что и загружаемая DLL.

Попробуйте открыть вашу DLL в этом инструменте (более современная версия DependencyWalker): https://github.com/lucasg/Dependencies и найдите DLL, которые не найдены.

...