from pybind11.setup_helpers import Pybind11Extension
ext_modules = [
Pybind11Extension(
"python_example",
sorted(glob("src/*.cpp")), # Sort source files for reproducibility
extra_link_args=[f"-Wl,-rpath,$ORIGIN"]
),
]
setup(..., ext_modules=ext_modules)
Я установил extra_link_args = [f "-wl, -rpath, $ Origin"] , как я понимаю, он внедрит начало в пути поиска нативных библиотек. (Я также попробовал без него без повезло). Мой модуль C ++ зависит от общей библиотеки, которую я поместил рядом с __init __. py . Но когда я пытаюсь импортировать свой модуль C ++, я получаю: < /p>
ImportError: libxxx: cannot open shared object file: No such file or directory
< /code>
Как я могу исправить ошибку? < /p>
Добавление более подробной /p>
- Убедитесь, что зависимость помещается в тот же каталог, что и модуль Pybind: < /li>
< /ol>
$ tree -L 1 venv/lib/python3.10/site-packages/my_package/
venv/lib/python3.10/site-packages/my_package/
├── __init__.py
├── __pycache__
├── my_data
├── libxxx.so.1
├── libyyy.so
├── libyyy.so.1.14.1
└── my_package_cpp.cpython-310-x86_64-linux-gnu.so
Убедитесь Добавить каталог, содержащий модуль в свой путь поиска: < /li>
< /ol>
$ readelf -d venv/lib/python3.10/site-packages/my_package/my_package.cpython-310-x86_64-linux-gnu.so | grep -E 'RPATH|RUNPATH'
0x000000000000001d (RUNPATH) Library runpath: [$ORIGIN]
И все же динамический линкер ищет поиск повсюду, за исключением каталога, содержащего сам модуль ($ ourigan ):
< /ol>
ld_debug = libs python3 -c "import my_pybind_module" < /p>
ldd не жалуется:
linux-vdso.so.1 (0x00007ffea75f7000)
libxxx.so.1 => /home/me/my_project/venv/lib/python3.10/site-packages/my_package/libxxx.so.1 (0x00007f072f352000)
libyyy.so.1.14.1 => /home/me/my_project/venv/lib/python3.10/site-packages/my_package/libyyy.so.1.14.1 (0x00007f072e3bb000)
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f072e187000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f072e167000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f072df3e000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f072de55000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f072de50000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f072de4b000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f072de46000)
/lib64/ld-linux-x86-64.so.2 (0x00007f072f48c000)
Подробнее здесь: https://stackoverflow.com/questions/793 ... -directory
Мобильная версия