Conda包装和C库作为依赖项

时间:2019-12-19 17:50:17

标签: anaconda conda conda-forge

Conda在控制程序包的必要依赖项方面做得很好,但是显然大多数程序包都将C库排除为可跟踪的依赖项。例如,让我们使用以下命令安装Gnuastro:

conda install -c conda-forge gnuastro

然后,我研究Gnuastro程序之一与之链接的库(例如astnoisechisel):

$ ldd $(which astnoisechisel)
    linux-vdso.so.1 (0x00007ffdbd336000)
    libgnuastro.so.9 => /path/to/conda/install/envs/testenv/bin/../lib/libgnuastro.so.9 (0x00007fe039ce1000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fe039b86000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe0399c6000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fe0399a5000)
    libgit2.so.28 => /path/to/conda/install/envs/testenv/bin/../lib/./libgit2.so.28 (0x00007fe039882000)
    libtiff.so.5 => /path/to/conda/install/envs/testenv/bin/../lib/./libtiff.so.5 (0x00007fe039800000)
    liblzma.so.5 => /path/to/conda/install/envs/testenv/bin/../lib/./liblzma.so.5 (0x00007fe0397d7000)
    libjpeg.so.9 => /path/to/conda/install/envs/testenv/bin/../lib/./libjpeg.so.9 (0x00007fe039799000)
    libwcs.so.5 => /path/to/conda/install/envs/testenv/bin/../lib/./libwcs.so.5 (0x00007fe03963e000)
    libcfitsio.so.8 => /path/to/conda/install/envs/testenv/bin/../lib/./libcfitsio.so.8 (0x00007fe039311000)
    libcurl.so.4 => /path/to/conda/install/envs/testenv/bin/../lib/./libcurl.so.4 (0x00007fe03928b000)
    libz.so.1 => /path/to/conda/install/envs/testenv/bin/../lib/./libz.so.1 (0x00007fe03926f000)
    libgsl.so.23 => /path/to/conda/install/envs/testenv/bin/../lib/./libgsl.so.23 (0x00007fe038fc6000)
    libcblas.so.3 => /path/to/conda/install/envs/testenv/bin/../lib/./libcblas.so.3 (0x00007fe03740d000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fe03a049000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fe037402000)
    libssl.so.1.1 => /path/to/conda/install/envs/testenv/bin/../lib/././libssl.so.1.1 (0x00007fe037372000)
    libcrypto.so.1.1 => /path/to/conda/install/envs/testenv/bin/../lib/././libcrypto.so.1.1 (0x00007fe0370c4000)
    libssh2.so.1 => /path/to/conda/install/envs/testenv/bin/../lib/././libssh2.so.1 (0x00007fe03708f000)
    libzstd.so.1 => /path/to/conda/install/envs/testenv/bin/../lib/././libzstd.so.1 (0x00007fe036fd3000)
    libbz2.so.1.0 => /path/to/conda/install/envs/testenv/bin/../lib/././libbz2.so.1.0 (0x00007fe036fbf000)
    libgssapi_krb5.so.2 => /path/to/conda/install/envs/testenv/bin/../lib/././libgssapi_krb5.so.2 (0x00007fe036f70000)
    libkrb5.so.3 => /path/to/conda/install/envs/testenv/bin/../lib/././libkrb5.so.3 (0x00007fe036e99000)
    libk5crypto.so.3 => /path/to/conda/install/envs/testenv/bin/../lib/././libk5crypto.so.3 (0x00007fe036e78000)
    libcom_err.so.3 => /path/to/conda/install/envs/testenv/bin/../lib/././libcom_err.so.3 (0x00007fe036e72000)
    libgfortran.so.4 => /path/to/conda/install/envs/testenv/bin/../lib/././libgfortran.so.4 (0x00007fe036d44000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fe036d3f000)
    libkrb5support.so.0 => /path/to/conda/install/envs/testenv/bin/../lib/./././libkrb5support.so.0 (0x00007fe036d31000)
    libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007fe036d17000)
    libquadmath.so.0 => /path/to/conda/install/envs/testenv/bin/../lib/././libquadmath.so.0 (0x00007fe036cdd000)
    libgcc_s.so.1 => /path/to/conda/install/envs/testenv/bin/../lib/././libgcc_s.so.1 (0x00007fe036cc9000)

除C库外,所有使用的高级库都在Conda环境中:libm.so.6libc.so.6libpthread.so.0librt.so.1,{{1} },libdl.so.2,当然还有libresolv.so.2

我在Conda-forge上找不到GNU C库,但是当我进行搜索时,发现了其他一些具有它的项目。例如,我尝试过:

ld-linux-x86-64.so.2

这安装了GNU C库2.30(3个月前创建的Conda tarball),上面的conda install -c neok.m4700 glibc 命令为我提供了Conda安装中所有内容的漂亮清单。在一个测试的Conda环境中,对ldd的调用产生了分段错误,而在另一个环境中,它成功了。然后我尝试了另一个Conda C库(在干净的环境中):

astnoisechisel --version

这是C库的较旧版本(最近更新于5年前:glibc 2.19)。在这种环境下,我的conda install -c asmeurer glibc 命令只会给出分段错误并崩溃。

this conda-forge discussion中,有人说“ glibc不好运送,如果我们不能使用系统glibc,我会担心这个软件包。与内核版本绑定在一起,使用旧版本也是安全隐患”。因此,我猜想,包括GNU C库(至少在GNU / Linux系统上)不是他们的政策。

我还看到Anaconda中“基本”软件包的类似问题。例如,当我检查astnoisechisel --versioncurl的链接标志时。

所以我的问题是这样的:如果C库没有被正式定义为依赖项(像所有其他依赖项一样),那么Conda软件包(尤其是旧版软件)在不久的将来有多可靠(例如上述情况下的5年)?

在类似的注释上:假设我需要手动获取用于构建Conda软件包的正确C库(以便能够运行可执行文件)。在下载的tarball内的任何位置都记录了该软件包的内部版本中使用的C库的版本吗?

0 个答案:

没有答案