PyBind11封装的Python包导入时无法找到依赖共享库libxxx的问题求助
PyBind11封装的Python包导入时无法找到依赖共享库libxxx的问题求助
我正在尝试构建一个能和C++代码交互的Python包,用PyBind11做了封装层,并且按照官方指引写了setup.py文件,代码如下:
from pybind11.setup_helpers import Pybind11Extension ext_modules = [ Pybind11Extension( "python_example", sorted(glob("src/*.cpp")), # 对源文件排序保证构建可复现 extra_link_args=[f"-Wl,-rpath,$ORIGIN"] ), ] setup(..., ext_modules=ext_modules)
我设置了extra_link_args=[f"-Wl,-rpath,$ORIGIN"],因为我理解这个参数会把模块所在的当前路径嵌入到原生库的搜索路径里(也试过不加这个参数,结果还是一样报错)。我的C++模块依赖一个共享库,我已经把它放在了__init__.py的同一目录下,但导入模块时却弹出错误:
ImportError: libxxx: cannot open shared object file: No such file or directory
该怎么解决这个错误呢?
补充一些我已经排查过的细节:
- 我已经确认依赖库和PyBind编译出的模块在同一个目录下:
$ 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
- 也验证了编译后的模块里已经设置了
RUNPATH为$ORIGIN,理论上动态链接器会把模块所在目录加入搜索路径:
$ 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]
但动态链接器似乎就是不会去模块所在目录(也就是
$ORIGIN指向的路径)搜索,我用调试命令查看了链接过程,确实没看到它去这个目录查找依赖。用
ldd直接检查编译后的模块文件时,却能正常找到所有依赖:
$ ldd venv/lib/python3.10/site-packages/my_package/my_package_cpp.cpython-310-x86_64-linux-gnu.so 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)
备注:内容来源于stack exchange,提问作者morpheus
相关产品推荐
相关产品推荐

