问题
pip install stpipeline
# 报错:
gcc -pthread -shared -B /root/miniconda3/envs/stpipeline/compiler_compat -L/root/miniconda3/envs/stpipeline/lib -Wl,-rpath=/root/miniconda3/envs/stpipeline/lib -Wl,--no-as-needed -Wl,--sysroot=/ build/temp.linux-x86_64-3.7/taggd/core/demultiplex_core_functions.o -o build/lib.linux-x86_64-3.7/taggd/core/demultiplex_core_functions.cpython-37m-x86_64-linux-gnu.so
/root/miniconda3/envs/stpipeline/compiler_compat/ld: cannot find /lib64/libpthread.so.0: No such file or directory
/root/miniconda3/envs/stpipeline/compiler_compat/ld: cannot find /usr/lib64/libpthread_nonshared.a: No such file or directory
collect2: error: ld returned 1 exit status
error: command 'gcc' failed with exit status 1
分析
pip build所使用的ld似乎默认会从/lib64 和/usr/lib64中寻找依赖库,但是conda环境中的对应目录位于${CONDA_PREFIX}/x86_64-conda-linux-gnu/sysroot/下,因此可以在conda加载环境时使用脚本生成软链,并在退出环境时将对应的软链删掉。
解决方案
cd $CONDA_PREFIX
mkdir -p ./etc/conda/activate.d
mkdir -p ./etc/conda/deactivate.d
touch ./etc/conda/activate.d/create_soft_link.sh
touch ./etc/conda/deactivate.d/delete_soft_link.sh
修改./etc/conda/activate.d/create_soft_link.sh 内容:
#!/bin/sh
for libfile in ${CONDA_PREFIX}/x86_64-conda-linux-gnu/sysroot/usr/lib64/lib*
do
filename=$(basename ${libfile})
ln -s $libfile /usr/lib64/${filename}
done
修改./etc/conda/deactivate.d/delete_soft_link.sh 内容:
#!/bin/sh
for link in /usr/lib64/*; do
if [ -L ${link} ]; then
target=$(readlink -f ${link})
if [[ ${target} == ${CONDA_PREFIX}/x86_64-conda-linux-gnu/sysroot/* ]]; then
rm -f ${link}
fi
fi
done