在conda环境中构建python库在.so文件中设置默认RPATH

2024-09-28 22:09:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用一个StupU.Py构建一些C++扩展的Python库。 和pybind11。由于我的C++扩展依赖于一些共享库,所以我希望在导入Python模块时自动找到这些纯C++库。 我做了一些研究,得出了将rpath值设置为存储这些库的文件夹的想法(使用LD_LIBRARY_PATH或LD_PRELOAD不是一个选项)

因此,基本上在my setup.py中,我为扩展模块添加了其他链接器选项:

linker_opts = ['-Wl,-rpath=path/to/my/lib']
Extension('python_module', extra_link_args=linker_opts)

由于某种原因,这种方法不起作用,经过一些研究,我发现 在conda环境中-rpath已设置为类似~/miniconda/envs/dev/lib的值,因此两次添加此路径不起作用

我用readelf -d somemodule.so检查了这一点,结果表明,当切换到一个简单的python环境时,这根本不是问题,所以看起来康达在默认情况下以某种方式设置了这个rpath

我查了conda的文件没有发现任何与此相关的信息, 那么,是否有一些简单的方法来禁用此默认rpath值

更新:关于安装,我使用python setup.py install

更新2:

同时我发现这个标志是由distutils生成的 conda环境中的版本。特别是

In [31]: distutils.sysconfig.get_config_vars('LDSHARED')
Out[31]: ['gcc -pthread -shared -B /.../miniconda3/envs/dev   /compiler_compat -L/../miniconda3/envs/dev/lib -Wl,-rpath=/./miniconda3/envs/dev/lib -Wl,--no-as-needed -Wl,--sysroot=/']

我只是好奇这是否与不同的distutils版本有关。conda中使用的是3.8.10,如果我使用系统python3.9,则为3.9.5。 似乎还有一个选择是,conda某处导出LD_SHARED,但我不确定在哪里


Tags: 模块pydev环境mylib选项setup