问题

本文介绍一种安装第三方模块时出现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
  2. 将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/
  3. 重新运行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"

本文在CC BY-NC-SA许可证下进行许可。最初发布于CSDN和segmentfault


Kurukuru
2 声望0 粉丝