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.6
,libc.so.6
,libpthread.so.0
,librt.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 --version
或curl
的链接标志时。
所以我的问题是这样的:如果C库没有被正式定义为依赖项(像所有其他依赖项一样),那么Conda软件包(尤其是旧版软件)在不久的将来有多可靠(例如上述情况下的5年)?
在类似的注释上:假设我需要手动获取用于构建Conda软件包的正确C库(以便能够运行可执行文件)。在下载的tarball内的任何位置都记录了该软件包的内部版本中使用的C库的版本吗?