运行cpp_extension的Python程序
(话说越来越感受到自己的成长了)之前一直最喜欢yolov5这种纯python写的基于pytorch的程序,既不需要安装cuda(只需要cuda runtime提供一些动态支持),也不需要编译,运行实在太简单方便了。
现在倒是慢慢地开始能接受各种各样的程序了(包括写的cpp extension的程序),并自行编译。
最重要的是!!!
能够依靠自己的经验解决各种报错问题了:
跑程序报错:
“/torch/include/ATen/cuda/CUDAContext.h:5:30: fatal error: cuda_runtime_api.h: 没有那个文件或目录”,这时候上网查就要说没安装cuda,cuda版本不对之类,或者在bashrc中添加路径,然而我既装好了cuda,又配置好了路径,感觉可能是程序的读取CUDA路径的方式有问题,直接在命令行重新export CUDA_HOME=xxx(区别于bashrc中export CUDA_HOME=$CUDA_HOME:的方式,原因之前文章提过)。
gcc: error trying to exec ‘cc1plus’: execvp: 没有那个文件或目录"
之后又报错:
“gcc: error trying to exec ‘cc1plus’: execvp: 没有那个文件或目录”。
下意识在网上查,有说没安装gcc/g++,有说改权限。可能确实适用于他们的问题,但是实际上相同的报错往往由于不同的原因。
分别使用gcc -v
和g++ -v
,返回以下信息:
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper
gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper
gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12)
分别去对应路径下,看到gcc-7中确实没有"cc1plus",而只有"cc1",而gcc-5中有"cc1plus",虽然不太懂具体的原理,但根据g++ -v
的输出是"gcc version 5.4.0 20",猜测是不是g++也是gcc的一种延申,只不过用了"cc1plus"的编译器而非"cc1",因此在gcc版本为7的情况下,也会在相同的文件夹下寻找"cc1plus",自然找不到,于是把gcc的版本切换为5:
sudo update-alternatives --config gcc
其中有gcc5和gcc7,选择gcc5,完成!