Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用pybind11链接其他共享库构建库_Python_C++_Pybind11 - Fatal编程技术网

Python 使用pybind11链接其他共享库构建库

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> 这里有几个选项(列表可能不完整):

我的项目回复在一个SO文件上,我将通过在我的项目文件夹下安装
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
  • 使用
    LD_PRELOAD
    运行python解释器
  • 将共享库的路径设置为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()
自动找到,并安装到
站点包中