如何解决在 conda 环境中构建 python 库在 .so 文件中设置默认 RPATH
我正在使用 setup.py 构建一个带有一些 C++ 扩展的 python 库
和pybind11。由于我的 C++ 扩展依赖于一些共享库,我希望在导入 Python 模块时自动找到这些纯 C++ 库。
我做了一些研究,并想到将 rpath
值设置为存储这些库的文件夹(不能使用 LD_LIBRARY_PATH 或 LD_PRELOAD)。
所以基本上在我的 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 环境时,这根本不是问题,所以似乎 Conda 以某种方式默认设置了这个 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
但我不确定在哪里...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。