CUDA与我的gcc版本不兼容。

151

我在编译CUDA SDK中的一些示例时遇到了问题。 我已经安装了开发者驱动程序(版本270.41.19)和CUDA工具包, 最后安装了SDK(4.0.17版本)。

最初它根本无法编译,会出现以下错误:

error -- unsupported GNU version! gcc 4.5 and up are not supported!

我在81行找到了负责的代码:/usr/local/cuda/include/host_config.h,然后将其修改为:

//#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 4)
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 6)

从那个点开始,我只编译了几个示例,然后就停在了这里:

In file included from /usr/include/c++/4.6/x86_64-linux-gnu/bits/gthr.h:162:0,
             from /usr/include/c++/4.6/ext/atomicity.h:34,
             from /usr/include/c++/4.6/bits/ios_base.h:41,
             from /usr/include/c++/4.6/ios:43,
             from /usr/include/c++/4.6/ostream:40,
             from /usr/include/c++/4.6/iterator:64,
             from /usr/local/cuda/include/thrust/iterator/iterator_categories.h:38,
             from /usr/local/cuda/include/thrust/device_ptr.h:26,
             from /usr/local/cuda/include/thrust/device_malloc_allocator.h:27,
             from /usr/local/cuda/include/thrust/device_vector.h:26,
             from lineOfSight.cu:37:
/usr/include/c++/4.6/x86_64-linux-gnu/bits/gthr-default.h:251:1: error: pasting         "__gthrw_" and "/* Android's C library does not provide pthread_cancel, check for
`pthread_create' instead.  */" does not give a valid preprocessing token
make[1]: *** [obj/x86_64/release/lineOfSight.cu.o] Error 1

由于一些示例可以编译,我认为这不是驱动程序的问题,而是与不受支持的gcc版本有关。降级不是一个选项,因为此时gcc4.6作为整个系统的依赖关系...


4
未来读者请注意:确保使用最新版的CUDA(除非您必须使用早期版本)。NVIDIA几乎每次发布都会提高最大支持编译器版本。 - einpoklum
这可能对那些使用CUDA 10并遇到gnu编译器链版本过高错误的人有所帮助:https://dev59.com/6a_la4cB1Zd3GeqPzd7a#53828864 - Douglas Daseeco
在安装detectron2时,我收到了类似的消息,因此我传递了系统变量export TORCH_DONT_CHECK_COMPILER_ABI=1并重新运行了setup.py,一切都顺利安装。我使用的是CUDA 12.0 g++ 12.x。 - Muneeb Ahmad Khurram
所以这是在说gcc在对这个软件包至关重要的方面上不是向前兼容的?这真是令人惊讶和失望。 - undefined
22个回答

2
如果你遇到这个错误,请阅读日志文件:
$ cat /var/log/cuda-installer.log 
[INFO]: Driver installation detected by command: apt list --installed | grep -e nvidia-driver-[0-9][0-9][0-9] -e nvidia-[0-9][0-9][0-9]
[INFO]: Cleaning up window
[INFO]: Complete
[INFO]: Checking compiler version...
[INFO]: gcc location: /usr/bin/gcc

[INFO]: gcc version: gcc version 9.2.1 20191008 (Ubuntu 9.2.1-9ubuntu2) 

[ERROR]: unsupported compiler version: 9.2.1. Use --override to override this check.

只需按照日志文件中的建议即可:

sudo sh cuda_<version>_linux.run --override

任务完成 :)

我刚刚使用--override选项,在Kubuntu 19.10上安装了CUDA 10.2和gcc 9.2。


2

Gearoid Murphy的解决方案非常好用。对于我来说,我有两个CUDA目录 -

/usr/local/cuda 
/usr/local/cuda-5.0

软连接只需添加到下面提到的目录中 -
/usr/local/cuda 

此外,正如SchighSchagh所提到的,需要使用g++和gcc软链接。

2

我必须安装旧版本的gcc和g++。

    sudo apt-get install gcc-4.4
    sudo apt-get install g++-4.4

请检查 /usr/bin/ 目录下是否有 gcc-4.4 和 g++,如果有,请按照上述解决方案进行操作:

    sudo ln -s /usr/bin/gcc-4.4 /opt/cuda/bin/gcc
    sudo ln -s /usr/bin/g++-4.4 /opt/cuda/bin/g++

当我尝试运行这个命令时,它显示“文件已存在”,并且不执行链接操作。需要帮助吗? - Sentient07
我恐怕已经远离这个问题,不知道该说什么。希望其他人能够提供帮助。 - travelingbones

2

对于像我这样在使用 cmake 时感到困惑的人,FindCUDA.cmake 脚本会覆盖 nvcc.profile 中的一些内容。您可以按照 http://public.kitware.com/Bug/view.php?id=13674 的说明设置 CUDA_HOST_COMPILER 来指定 nvcc 主机编译器。


cmake .. -DCMAKE_INSTALL_PREFIX=/InstallPos_GPU/ -DCMAKE_C_COMPILER="/gcc-8.3.0/bin/gcc" -DCMAKE_CXX_COMPILER="/gcc-8.3.0/bin/g++" -DGMX_GPU=ON -DCUDA_TOOLKIT_ROOT_DIR=/cuda-7.5/ -D NVCCFLAGS=" -ccbin /cuda-7.5/bin/" -DCUDA_HOST_COMPILER=/cuda-7.5/bin/gcc 我已成功安装了支持GPU的Gromacs。 - pengchy

2

2

另一种配置nvcc使用特定版本的gcc(例如gcc-4.4)的方法是编辑 nvcc.profile 文件,将 PATH 更改为包含您想要首先使用的gcc的路径。

例如(在 /opt 中安装了 gcc-4.4.6):

PATH += /opt/gcc-4.4.6/lib/gcc/x86_64-unknown-linux-gnu/4.4.6:/opt/gcc-4.4.6/bin:$(TOP)/open64/bin:$(TOP)/share/cuda/nvvm:$(_HERE_):
nvcc.profile 的位置是不固定的,但应该与 nvcc 可执行文件本身在同一个目录下。
这有点像一个 hack,因为根据 nvcc 手册,nvcc.profile 不是用于用户配置的,但这是我使用时效果最好的解决方案。

我建议这样做,即将路径指向一个带有g++符号链接到正确的gcc版本的目录(如果您的发行版提供了支持的gcc版本,则特别有用)。例如: mkdir /usr/local/bin/cuda-hack && ln -s /usr/bin/g++-5 /usr/local/bin/cuda-hack - Sami Liedes

1
对于CUDA 6.5(以及显然的7.0和7.5),我创建了一个gcc 4.8.5 RPM软件包的版本(在Fedora Core 30下),允许安装该版本的gcc并与系统当前的GCC一起运行。
您可以在这里找到所有这些信息。

0

为了在Ubuntu 16.10上编译CUDA 8.0示例,我执行了以下操作:

sudo apt-get install gcc-5 g++-5
cd /path/to/NVIDIA_CUDA-8.0_Samples
# Find the path to the library (this should be in NVIDIA's Makefiles)
LIBLOC=`find /usr/lib -name "libnvcuvid.so.*" | head -n1 | perl -pe 's[/usr/lib/(nvidia-\d+)/.*][$1]'`
# Substitute that path into the makefiles for the hard-coded, incorrect one
find . -name "*.mk" | xargs perl -pi -e "s/nvidia-\d+/$LIBLOC/g"
# Make using the supported compiler
HOST_COMPILER=g++-5 make

这样做的好处是不需要修改整个系统或者只是为二进制文件创建符号链接(这可能会导致库链接问题)。


0
在我的情况下,我已经从Ubuntu版本中安装了CUDA,而cmake会检测到它,而不是使用NVidia SDK Manager新安装的版本。
我运行了dpkg -l | grep cuda,并且可以看到两个版本。
我需要做的是卸载旧的CUDA(在我的情况下是9.1版本),并保留新版本(10.2版本)。我使用了清除命令,如下所示:
sudo apt-get purge libcudart9.1 nvidia-cuda-dev nvidia-cuda-doc \
                                nvidia-cuda-gdb nvidia-cuda-toolkit

请确认软件包名称与您想从安装中删除的版本匹配。
我不得不从空的“BUILD”目录重新运行 cmake,以将所有 #include 和库重定向到 SDK 版本(因为旧路径已经固定在现有的构建环境中)。

0
这解决了我的问题:
sudo rm /usr/local/cuda/bin/gcc
sudo rm /usr/local/cuda/bin/g++
sudo apt install gcc-4.4 g++-4.4
sudo ln -s /usr/bin/gcc-4.4 /usr/local/cuda/bin/gcc
sudo ln -s /usr/bin/g++-4.4 /usr/local/cuda/bin/g++

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接