情况是这样的,正在写一个 python 的库叫作 mylib ,里面要用到一个 c/c++写的库,叫作 otherlib ,我只有编译好的.a 和.h 头文件。为了使用 otherlib 的功能,我写了个.c 文件,然后编译出
funcs.so 给 python 用,通过 ctypes 来交互。这个 otherlib 有点古老,需要低版本的
libcrypto.so ,不然有些 symbol 找不到( init 啥的函数)。我电脑里有已经编译好的 libcrypto.so.1.0.0 (在/opt/mypath/lib 下),所以编译的时候,要提供-L 和-Wl,rpath 这些参数给 gcc ,不然
funcs.so 的时候没办法找到这个版本的动态库。
折腾了很久,把这些编译的过程都写在
setup.py 中,本地跑已经没问题,用户直接把包拷过去 pip install.也没问题。 问题出现在 conda package 打包。
首先,我不能要求把 openssl 的依赖固定到低版本:虽然这个 otherlib 用了老版本的
libcrypto.so ( 1.0.0 或者 2.x.x ),但 mylib 中其他的依赖都已经用 3.x.x 。 其次,我设置的 rpath 参数不在 conda 的 build 环境中,一直给我报错,试了各种 whitelist 也没用。 这个库自带了 libressl ,我想着让 conda 直接编译了放到 env 里,但是 CONDA_PREFIX 这种东西指向的是 build 的环境,傻傻搞不清楚。
说实话,搞不懂 conda build 到底是个什么概念,
这些.so 文件的编译不应该是用户那里跑的吗,为什么在我打包的时候要跑一次,那赋值 rpath 就变得非常困难了。有一个 @
ORIGIN 的符号,但是这个符号本身代表的是 python 这个程序?那难道我要把东西都编译到 @
ORIGIN/../lib/mylib/?
拓展一下,如果我要写一个 C++程序也用到这个 otherlib 库,但同时又有一个依赖需要高版本
libcrypto.so ,那我是不是就没办法编译了?
这个问题可能是相当深入了,不知道有没有大神能讲清楚,谢谢!!!
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/1109248
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.