Python 使用pybind11链接其他共享库构建库
我的项目回复在一个SO文件上,我将通过在我的项目文件夹下安装Python 使用pybind11链接其他共享库构建库,python,c++,pybind11,Python,C++,Pybind11,我的项目回复在一个SO文件上,我将通过在我的项目文件夹下安装cmake来完成。当我运行python setup.py install 但我是通过pip安装它的,因为pip会将项目复制到一个tmpfile中,安装后它会被删除,SO文件也会被删除。因此,当我导入项目时,由于找不到SO文件而失败 当然,我可以将SO文件安装到/usr/local/lib,但我不想这样做 有人有办法解决这个问题吗?您需要在运行时发现共享库。同样的规则适用于常规C++可执行文件。p> 这里有几个选项(列表可能不完整):
cmake
来完成。当我运行python setup.py install
但我是通过pip安装它的,因为pip会将项目复制到一个tmpfile中,安装后它会被删除,SO文件也会被删除。因此,当我导入项目时,由于找不到SO文件而失败
当然,我可以将SO文件安装到/usr/local/lib
,但我不想这样做
有人有办法解决这个问题吗?您需要在运行时发现共享库。同样的规则适用于常规C++可执行文件。p> 这里有几个选项(列表可能不完整):
- 将共享库与其他共享库一起放置(例如
)/usr/lib/
- 将带有共享库路径的自定义配置添加到
/etc/ld.so.conf.d/my_lib.conf
- 在调用python解释器之前设置
LD\u LIBRARY\u PATH
- 使用
运行python解释器LD_PRELOAD
- 将共享库的路径设置为pybind11模块的
属性李>RPATH
我个人喜欢后一种选择:它允许我自由地使用virtualenv如果你有一个轮子包,你也可以看看
auditwheel repair
:将这些外部共享库复制到控制盘本身,并自动修改相应的RPATH条目,以便在运行时提取这些库。这实现了一个类似的结果,就好像这些库是静态链接的,而不需要修改构建系统一样。包装商被告知,捆绑,如静态链接,可能涉及版权问题
可能有用不幸的是,这没用是的,我知道。问题是我不知道如何存储so文件。我不想将其放入
/usr/local/lib
文件夹。我想将其放入已安装的文件夹,例如~/.local/lib/python3.x/sites package/example.egg/
@binbin,在链接的setup.py a-DCMAKE\u LIBRARY\u OUTPUT\u DIRECTORY\u RELEASE
中设置为扩展,因此它由find_packages()
自动找到,并安装到站点包中