[快修] 深度学习安装第三方库时出现cannot find /lib64/libpthread.so.0的错误

问题

本文介绍一种安装第三方模块时出现cannot find /lib64/libpthread.so.0的修复方法。完整的错误信息应当是这样的

python setup.py install

出现错误信息

g++ -pthread -B /home/publicuser/anaconda3/envs/mycondaenv/compiler_compat -Wl,--sysroot=/ -pthread -shared -B /home/publicuser/anaconda3/envs/mycondaenv/compiler_compat -L/home/publicuser/anaconda3/envs/mycondaenv/lib -Wl,-rpath=/home/publicuser/anaconda3/envs/mycondaenv/lib -Wl,--no-as-needed -Wl,--sysroot=/ build/temp.linux-x86_64-cpython-38/cuda_rasterizer/backward.o build/temp.linux-x86_64-cpython-38/cuda_rasterizer/forward.o build/temp.linux-x86_64-cpython-38/cuda_rasterizer/rasterizer_impl.o build/temp.linux-x86_64-cpython-38/ext.o build/temp.linux-x86_64-cpython-38/rasterize_points.o -L/home/publicuser/anaconda3/envs/mycondaenv/lib/python3.8/site-packages/torch/lib -L/usr/local/cuda-11.3/lib64 -lc10 -ltorch -ltorch_cpu -ltorch_python -lcudart -lc10_cuda -ltorch_cuda_cu -ltorch_cuda_cpp -o build/lib.linux-x86_64-cpython-38/mycondaenv_diff_gaussian_rasterization/_C.cpython-38-x86_64-linux-gnu.so
/home/publicuser/anaconda3/envs/mycondaenv/compiler_compat/ld: cannot find /lib64/libpthread.so.0: No such file or directory
/home/publicuser/anaconda3/envs/mycondaenv/compiler_compat/ld: cannot find /usr/lib64/libpthread_nonshared.a: No such file or directory
collect2: error: ld returned 1 exit status
error: command '/home/publicuser/anaconda3/envs/mycondaenv/bin/g++' failed with exit code 1

原因

安装第三方深度学习模块时,往往含有CUDA C++代码,需要使用nvcc进行编译,此时如果系统版本不符,便会导致nvcc无法找到libpthread.so.0和libpthread_nonshared.a两个文件。

通常情况下,conda会自动管理nvcc版本,但有些库作者会在CMakeList或者其他构建系统中硬编码链接的库的版本,导致conda的sysroot无法替代这些库。
在一些平台上,会介绍通过export CFLAGS='-Wl,sysroot='~/anaconda3/envs/esmfold/x86_64-conda-linux-gnu/sysroot'这样的命令[1]来修复这个问题。理论上这可以覆写编译命令,但是g++在链接库时是有先后顺序的,我们可以看到,在g++编译命令中,链接到的pthread库的顺序实在最前面的,导致实际上无法被CFLAGS影响到。
解决问题的方式有很多,最终尝试成功的是最直接的复制库文件。

解决方法

注意: 本方法具有一定的风险,操作不当可能会损害系统,请做好备份并谨慎使用。在现场外恢复误操作导致的严重问题时,root密码是必要的,请确保出问题时能拿到root密码进行修复。

  1. 备份 /lib64 和 /usr/lib
sudo cp -r /usr/lib64 ~/libbackup
sudo cp -r /lib64 ~/libbackup
  1. 将conda中的库文件拷贝到系统中, 我们假设你的conda环境名是mycondaenv
# 注意: 一定不要省略 -inr 参数中的n, 否则会严重损害系统
sudo cp -inr ~/anaconda3/envs/mycondaenv/x86_64-conda-linux-gnu/sysroot/usr/lib64/* /usr/lib64/
sudo cp -inr ~/anaconda3/envs/mycondaenv/x86_64-conda-linux-gnu/sysroot/lib64/* /lib64/
  1. 重新运行Python命令
python setup.py install

备注

本文只是介绍一种应急处理方式, 更合理的修复方式应当是存在的。
如果你不慎删除了/lib64中的文件,请搜索误删lib64/ld-linux-x86-64.so.2的恢复方法。

[1] 该命令来自Jianquan Zhao的"ld: cannot find /lib64/libpthread.so.0 ld: cannot find /usr/lib64/libpthread_nonshared.a"

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值