CUDA与我的gcc版本不兼容


102

我在编译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 2015年

这对于那些有CUDA 10是有益的,得到的误差过高的GNU编译器链版本:stackoverflow.com/questions/53344283/...
道格拉斯Daseeco

Answers:


114

如前所述,nvcc取决于gcc 4.4。通过将软链接添加到使用nvcc安装创建的bin目录中,可以将nvcc配置为使用正确版本的gcc,而不传递任何编译器参数。

默认的cuda二进制目录(安装默认)是/ usr / local / cuda / bin,从该目录向正确的gcc版本添加软链接就足够了:

sudo ln -s /usr/bin/gcc-4.4 /usr/local/cuda/bin/gcc


1
“ update-alternatives”命令也可能会有所帮助,尤其是在安装CUDA 5.0时
phoad

4
我还必须向正确的g ++版本添加符号链接。
Auron 2013年

17
我还必须链接到g ++。否则,简单的nvcc调用就可以工作,但是说,将其make应用于CUDA示例,很快就会引入以以下内容开头的调用:nvcc -ccbin g++。对我来说,我使用sudo ln -s /usr/bin/gcc-4.9 /usr/local/cuda/bin/gccsudo ln -s /usr/bin/g++-4.9 /usr/local/cuda/bin/g++
user2023370

8
如果编译,cmake .. && make可以尝试 cmake -D CUDA_NVCC_FLAGS="-ccbin gcc-4.4" .. && make。如果使用普通格式Makefile,则可以尝试 make CXX=g++-4.4 CC=gcc-4.4
patryk.beza '16

1
当我尝试此命令时,它说“文件存在”并且不执行链接。有什么帮助吗?
Sentient07

58

CUDA不支持gcc 4.5和4.6-无法编译代码,并且其他工具链(包括cuda-gdb)将无法正常工作。您不能使用它们,并且该限制是不可协商的。

您唯一的解决方案是安装gcc 4.4版本作为第二个编译器(大多数发行版都允许这样做)。nvcc有一个选项--compiler-bindir,可用于指向备用编译器。创建一个本地目录,然后建立到支持的gcc版本可执行文件的符号链接。通过该--compiler-bindir选项将该本地目录传递给nvcc ,您应该能够编译CUDA代码而不会影响系统的其余部分。


编辑

请注意,此问题和答案与CUDA 4有关。

自编写以来,NVIDIA在新的CUDA工具链版本中继续扩展了对更高版本的gcc版本的支持。

  • 从CUDA 4.1版本开始,现在支持gcc 4.5。不支持gcc 4.6和4.7。
  • 从CUDA 5.0版本开始,现在支持gcc 4.6。不支持gcc 4.7。
  • 从CUDA 6.0版本开始,现在支持gcc 4.7。
  • 从CUDA 7.0版本开始,完全支持gcc 4.8,而在Ubuntu 14.04和Fedora 21上则有4.9支持。
  • 从CUDA 7.5版本开始,完全支持gcc 4.8,而在Ubuntu 14.04和Fedora 21上则有4.9支持。
  • 从CUDA 8版本开始,Ubuntu 16.06和Fedora 23完全支持gcc 5.3。
  • 从CUDA 9版本开始,在Ubuntu 16.04,Ubuntu 17.04和Fedora 25上完全支持gcc 6。
  • CUDA 9.2版本增加了对gcc 7的支持
  • CUDA 10.1版本增加了对gcc 8的支持

当前(从CUDA 10.1开始)在CUDA中不支持gcc 9。

请注意,NVIDIA最近在此处添加了一个非常有用的表其中包含当前CUDA版本支持的编译器和OS矩阵。


知道CUDA 7.5使用了什么吗?
GuySoft '16

2
gcc 4.9.3在SLES 11 SP3上使用CUDA 7.5,没有任何问题。
彼得·VARGA,

3
什么?代码应该如何不与更高版本一起编译(当然,除了硬编码限制外)?我唯一能想到的是,由于某些版本默认启用了C11 / C ++ 11,但是如果这导致旧代码出现问题,则可以使用命令行开关轻松解决。
Hi-Angel

2
借用@ Hi-Angel。#talonmies“限制是不可协商的”甚至是什么意思?较新版本的gcc和gdb支持目标文件的较旧的二进制标头,因为它们“总是”(某种)具有,因此没有理由较新的gcc版本不起作用。除了符号链接解决方案之外,任何其他问题很可能是ac预处理程序版本标志设置,并且如果gcc版本测试是在cuda标头中作为“定义”或宏的一部分进行“硬编码”的,则很容易修复。例外可能是cuda gpu编译器本身。
Beracah

1
这不是二进制兼容性问题。CUDA工具链要求nvcc和GPU前端解析器可以拦截并重载各种编译器和libc / libc ++内部标头,以同时编译主机和设备代码并将它们集成在一起。除其他事项外,CUDA解析器需要能够正确解析gcc内部标头。无论NVIDIA标头内置的预处理器防护如何,未经测试的gcc版本都可能并且确实会失败。您可以相信我(作为一个在CUDA工具链上进行黑客攻击已有近10年的人),也可以不相信。在这一点上,我不是真的
talonmies'Nov

57
  1. 检查您的CUDA版本支持的最大GCC版本:

     | CUDA version | max supported GCC version |
     |--------------|---------------------------|
     |      11      |             9             |
     |  10.1, 10.2  |             8             |
     |   9.2, 10.0  |             7             |
     |   9.0, 9.1   |             6             |
     |       8      |            5.3            |
     |       7      |            4.9            |
     |    5.5, 6    |            4.8            |
     |    4.2, 5    |            4.6            |
     |      4.1     |            4.5            |
     |      4.0     |            4.4            |
  2. 为该GCC版本设置环境变量。例如,对于CUDA 10.2:

     MAX_GCC_VERSION=8
  3. 确保已安装该版本:

     sudo apt install gcc-$MAX_GCC_VERSION g++-$MAX_GCC_VERSION
  4. 在CUDA文件夹中添加符号链接:

     sudo ln -s /usr/bin/gcc-$MAX_GCC_VERSION /usr/local/cuda/bin/gcc 
     sudo ln -s /usr/bin/g++-$MAX_GCC_VERSION /usr/local/cuda/bin/g++

    /usr/local/cuda如果不存在,请替换为您的CUDA安装路径)

有关CUDA-GCC兼容性表的更多信息,请参见GitHub要点


3
拯救了我的生命,大声笑配置噩梦!!!!谢谢。我将其应用于具有gcc和g ++ 7系统链接的cuda 10。对于遇到此问题的任何人。
thekevshow '19

我应该自己创建/usr/bin/gccand /usr/bin/g++/usr/local/cuda/bin/gcc文件夹吗?
乔什·戴斯蒙德

@JoshDesmond符号链接关于你提到的在步骤4中创建的文件
bryant1410

@ bryant1410当我在第四步中运行命令时,我记得遇到了类似的错误:“错误:目录/ usr / local / cuda / bin / gcc不存在,正在中止”或类似的东西。我现在意识到了(在阅读了问题的详细信息之后),您的回答假定了OP提到的第0步:“我已经安装了CUDA工具包,然后是SDK。” 我试图用NVIDIA的cuda_10.2.89_440.33.01_linux.runWizardy工具进行安装,该向导在运行时因抱怨gcc兼容性而失败。我最终决定卸载gcc 9:P
乔什·戴斯蒙德

1
如果你安装了NVCC [ANA |小]康达(康达锻包cudatoolkit-dev),那么你需要链接你的ENV像内部ln -s /usr/bin/gcc-8 /home/user/miniconda3/envs/your_env/bin/gccln -s /usr/bin/g++-8 /home/user/miniconda3/envs/your_env/bin/g++
迭戈费里

25

Gearoid Murphy的解决方案对我来说效果更好,因为在我的发行版(Ubuntu 11.10)上,gcc-4.4和gcc-4.6位于同一目录中,因此--compiler-bindir没有帮助。唯一的警告是我还必须安装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++

11

对于CUDA7.5,这些行有效:

sudo ln -s /usr/bin/gcc-4.9 /usr/local/cuda/bin/gcc 
sudo ln -s /usr/bin/g++-4.9 /usr/local/cuda/bin/g++

9

查看如何使用“更新替代”来解决此问题:

...如果您安装gcc 4.6,也可以使用update-alternatives命令轻松切换版本。可以使用以下配置:

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 60 --slave /usr/bin/g++ g++ /usr/bin/g++-4.6 
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.7 40 --slave /usr/bin/g++ g++ /usr/bin/g++-4.7 
sudo update-alternatives --config gcc

6

如果cmake对我来说,编辑文件和链接的技巧都不起作用,那么我使用指定gcc / g ++版本的标志进行编译。
cmake -DCMAKE_C_COMPILER=gcc-6 -DCMAKE_CXX_COMPILER=g++-6 ..

像魅力一样工作。


哈哈,我打算尝试从此处的其他问题链接您的答案,因为我认为需要将其放在此线程上。再次努力!谢谢
MikeDoho '18

一个人应该避免在SO上发布重复的答案,但是我别无选择。:)
markroxor

5

在大多数发行版中,除了最新的编译器(例如gcc-4.7)之外,您还可以安装其他gcc和g ++版本。此外,大多数构建系统都知道CCCXX环境变量,可以分别指定其他C和C ++编译器。所以我建议类似:

CC=gcc-4.4 CXX=g++-4.4 cmake path/to/your/CMakeLists.txt

对于Makefile,应该有类似的方法。我不建议在/ usr / local中设置自定义符号链接,除非您知道自己在做什么。


3

这适用于fedora23。compated gcc存储库将根据您的fedora版本而稍有不同。

如果安装以下存储库:

sudo yum install compat-gcc-34-c++-3.4.6-37.fc23.x86_64 compat-gcc-34-3.4.6-37.fc23.x86_64 

现在,按照上面提到的进行软链接,假设您的cuda bin文件夹位于 /usr/local/cuda/

sudo ln -s /usr/bin/gcc-34 /usr/local/cuda/bin/gcc
sudo ln -s /usr/bin/g++-34 /usr/local/cuda/bin/g++

现在,您应该可以进行编译,nvcc而不会出现gcc版本错误。


2

Gearoid Murphy的解决方案就像一个魅力。对我来说,我有两个cuda目录-

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

只需将软链接添加到下面提到的目录中-

/usr/local/cuda 

另外,如SchighSchagh所述,g ++和gcc软链接都是必需的。


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位于同一目录中可执行文件本身。

这有点骇人听闻,因为nvcc.profile并非按照nvcc手册用于用户配置,但这是最适合我的解决方案。


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

2

CUDA经过一些与gcc4.7或更高版本兼容的标头修改后:https ://www.udacity.com/wiki/cs344/troubleshoot_gcc47


2

对于像我这样在使用时感到困惑的人们cmake,该FindCUDA.cmake脚本覆盖了来自的一些东西nvcc.profile。您可以nvcc通过CUDA_HOST_COMPILER按照http://public.kitware.com/Bug/view.php?id=13674进行设置来指定主机编译器。


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

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

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

检查gcc-4.4是否在/ usr / bin /中,和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

在中$CUDA_HOME/include/host_config.h,找到以下行(在不同的CUDA版本之间可能略有不同):

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

#error -- unsupported GNU version! gcc versions later than 4.9 are not supported!

#endif [> __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 9) <]
//...

根据您的条件删除或更改它们。

请注意,此方法可能不安全,可能会破坏您的构建。例如,gcc 5默认使用C ++ 11,但是从CUDA 7.5开始,nvcc并非如此。解决方法是添加

--Xcompiler="--std=c++98" 对于CUDA <= 6.5

要么

--std=c++11 对于CUDA> = 7.0。


我们将--std=c++选项添加到哪里?
asgs

1

如果遇到此错误,请阅读日志文件:

$ 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上安装了带有gcc 9.2的CUDA 10.2 。


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

这解决了我的问题:

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++

0

对于CUDA 6.5(显然是7.0和7.5),我创建了gcc 4.8.5 RPM软件包的版本(在Fedora Core 30下),该版本的gcc可以与系统当前的GCC一起安装。

您可以在此处找到所有这些信息。


0

就我而言,我已经从Ubuntu版本安装了CUDA,而cmake将使用NVidia SDK Manager来检测该版本而不是新安装的版本。

我跑了 dpkg -l | grep cuda,可以看到两个版本。

我要做的是卸载旧的CUDA(在我的情况下为9.1版),而单独保留新版本(10.2版)。我像这样使用purge命令:

sudo apt-get purge libcudart9.1 nvidia-cuda-dev nvidia-cuda-doc \
                                nvidia-cuda-gdb nvidia-cuda-toolkit

请确认软件包名称与您要从安装中删除的版本匹配。

我必须cmake从空白BUILD目录重新运行,以将所有#include和库重定向到SDK版本(因为旧路径是在现有构建环境中生成的)。


-1

发生这种情况是因为您当前的CUDA版本不支持您当前的GCC版本。您需要执行以下操作:

  1. 查找受支持的GCC版本(在我的情况下为CUDA 9,为5)

    • CUDA 4.1: GCC 4.5
    • CUDA 5.0: GCC 4.6
    • CUDA 6.0: GCC 4.7
    • CUDA 7.0: GCC 4.8
    • CUDA 7.5: GCC 4.8
    • CUDA 8: GCC 5.3
    • CUDA 9: GCC 5.5
    • CUDA 9.2: GCC 7
    • CUDA 10.1: GCC 8
  2. 安装支持的GCC版本

    sudo apt-get install gcc-5
    sudo apt-get install g++-5
  3. 更改/usr/bin目录中GCC的软链接

    cd /usr/bin
    sudo rm gcc
    sudo rm g++
    sudo ln -s /usr/bin/gcc-5 gcc
    sudo ln -s /usr/bin/g++-5 g++
  4. 更改/usr/local/cuda-9.0/bin目录中GCC的软链接

    cd /usr/local/cuda-9.0/bin
    sudo rm gcc
    sudo rm g++
    sudo ln -s /usr/bin/gcc-5 gcc
    sudo ln -s /usr/bin/g++-5 g++
  5. 添加-DCUDA_HOST_COMPILER=/usr/bin/gcc-5到您的setup.py文件中,用于编译

    if torch.cuda.is_available() and CUDA_HOME is not None:
        extension = CUDAExtension
        sources += source_cuda
        define_macros += [("WITH_CUDA", None)]
        extra_compile_args["nvcc"] = [
            "-DCUDA_HAS_FP16=1",
            "-D__CUDA_NO_HALF_OPERATORS__",
            "-D__CUDA_NO_HALF_CONVERSIONS__",
            "-D__CUDA_NO_HALF2_OPERATORS__",
            "-DCUDA_HOST_COMPILER=/usr/bin/gcc-5"
        ]
  6. 删除旧的构建目录

    rm -rd build/
  7. 通过设置再次编译 CUDAHOSTCXX=/usr/bin/gcc-5

    CUDAHOSTCXX=/usr/bin/gcc-5 python setup.py build develop

注意:如果gcc: error trying to exec 'cc1plus': execvp: no such file or directory按照以下步骤操作后仍然出现错误,请尝试像这样重新安装GCC,然后重新编译:

sudo apt-get install --reinstall gcc-5
sudo apt-get install --reinstall g++-5

积分:https : //github.com/facebookresearch/maskrcnn-benchmark/issues/25#issuecomment-433382510

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.