CUDA与我的gcc版本不兼容

我有麻烦编译CUDA SDK附带的一些例子。 我已经安装了开发者驱动(版本270.41.19)和CUDA工具包,最后是SDK(都是4.0.17版本)。

起初,它并没有编译:

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

我在81find了这个行:/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 

正如一些例子编译我认为这不是一个驱动程序的问题,而是必须有一个不支持的海湾合作委员会版本。 降级不是一个选项,因为在这一点上gcc4.6有一个完整的系统作为依赖…

正如已经指出的,nvcc依赖于gcc 4.4。 可以将nvccconfiguration为使用正确版本的gcc,而无需传递任何编译器参数,方法是将软链接添加到使用nvcc安装创build的bin目录中。

默认的cuda二进制目录(安装缺省值)是/ usr / local / cuda / bin,从这个目录添加一个到正确版本gcc的softlink就足够了:

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

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

你唯一的解决scheme是安装一个gcc 4.4版本作为第二个编译器(大多数发行版将允许)。 有一个选项可以用来指向另一个编译器的nvcc --compiler-bindir 。 创build一个本地目录,然后创build支持的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)在CUDA中没有gcc 7的支持。

请注意,NVIDIA最近在这里添加了一个非常有用的表格,其中包含当前CUDA版本支持的编译器和操作系统matrix。

Gearoid Murphy的解决scheme对我来说更好,因为在我的发行版(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++ 

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

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

…如果你安装了gcc 4.6,你也可以使用update-alternatives命令来轻松切换版本。 这可以configuration为:

 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 

在大多数发行版中,您可以在gcc-4.7之类的最新编译器旁边安装另一个gcc和g ++版本。 另外,大多数构build系统都知道CCCXX环境variables,它们可以分别指定其他C和C ++编译器。 所以我build议这样的:

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

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

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

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

软链接只能被添加到下面提到的目录中 –

 /usr/local/cuda 

另外,SchighSchagh提到了g ++和gcc软链接。

另一种configurationnvcc使用特定版本的gcc(例如gcc-4.4)的方法是编辑nvcc.profile并修改PATH以包含首先要使用的gcc的path。

例如(安装在/ 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手册的用户configuration,而是最适合我的解决scheme。

CUDA经过了一些与gcc4.7兼容的头文件修改,也许更高版本: https ://www.udacity.com/wiki/cs344/troubleshoot_gcc47

我不得不安装旧版本的gcc,g ++。

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

检查gcc-4.4是否在/ usr / bin /中,对于g ++是一样的然后我可以使用上面的解决scheme:

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

这适用于Fedora 23.基于你的Fedora版本,compcc的gcc版本库会有一些不同。

如果您安装以下存储库:

 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版本错误。

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

更新:

对于CUDA 9:

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

你需要先安装gcc和g ++ 6:

 sudo apt install gcc-6 g++-6 

老答案:

对于CUDA 8:

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

你需要先安装gcc和g ++ 5:

 sudo apt install gcc-5 g++-5 

$CUDA_HOME/include/host_config.h ,find这样的行(在不同的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) <] //... 

删除或更改它们符合您的条件。

请注意,此方法可能不安全,可能会破坏构build。 例如,gcc 5使用C ++ 11作为默认值,但nvcc从CUDA 7.5开始并不是这种情况。 解决方法是添加

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

要么

--std=c++11 for CUDA> = 7.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 

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