我在编译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此时将整个系统作为依赖...
答案 0 :(得分:97)
正如已经指出的那样,nvcc依赖于gcc 4.4。通过将软链接添加到使用nvcc install创建的bin目录,可以将nvcc配置为使用正确版本的gcc而不传递任何编译器参数。
默认的cuda二进制目录(安装默认值)是/ usr / local / cuda / bin,从这个目录添加到正确版本的gcc的软链接就足够了:
sudo ln -s /usr/bin/gcc-4.4 /usr/local/cuda/bin/gcc
答案 1 :(得分:46)
您唯一的解决方案是将gcc 4.4版本安装为 second 编译器(大多数发行版都允许这样做)。 nvcc --compiler-bindir
有一个选项,可用于指向备用编译器。创建一个本地目录,然后创建指向支持的gcc版本可执行文件的符号链接。通过--compiler-bindir
选项将该本地目录传递给nvcc,您应该能够编译CUDA代码而不会影响系统的其余部分。
修改强>:
请注意,这个问题和答案与CUDA 4有关。自编写以来,NVIDIA在更新的CUDA工具链版本中继续扩展对后来gcc版本的支持
目前(截至CUDA 10)在CUDA中没有gcc 8支持。
请注意,NVIDIA最近添加了一个非常有用的表here,其中包含当前CUDA版本支持的编译器和OS矩阵。
答案 2 :(得分:29)
对于CUDA 10:
sudo ln -s /usr/bin/gcc-7 /usr/local/cuda/bin/gcc
sudo ln -s /usr/bin/g++-7 /usr/local/cuda/bin/g++
您需要先安装gcc和g ++ 7:
sudo apt install gcc-7 g++-7
对于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
答案 3 :(得分:24)
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++
答案 4 :(得分: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++
答案 5 :(得分:8)
查看how to use "update-alternatives"以解决此问题:
...如果你安装了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 :(得分:5)
在大多数发行版上,您可以在最新的编译器(如gcc-4.7)旁边安装另一个gcc和g ++版本。此外,大多数构建系统都知道CC
和CXX
环境变量,它们分别指定了其他C和C ++编译器。所以我建议像:
CC=gcc-4.4 CXX=g++-4.4 cmake path/to/your/CMakeLists.txt
对于Makefile,应该采用类似的方式。我不建议在/ usr / local中设置自定义符号链接,除非你知道自己在做什么。
答案 7 :(得分:3)
这适用于fedora 23.根据您的fedora版本,compat 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版本错误。
答案 8 :(得分:3)
如果对我使用cmake
,则没有任何编辑文件和链接的技巧,因此我使用指定gcc / g ++版本的标志进行编译。
cmake -DCMAKE_C_COMPILER=gcc-6 -DCMAKE_CXX_COMPILER=g++-6 ..
像魅力一样工作。
答案 9 :(得分: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++
答案 10 :(得分:2)
对于像我这样在使用cmake
时感到困惑的人,FindCUDA.cmake
脚本会覆盖nvcc.profile
中的部分内容。您可以按照http://public.kitware.com/Bug/view.php?id=13674设置nvcc
来指定CUDA_HOST_COMPILER
主机编译器。
答案 11 :(得分:2)
CUDA经过一些与gcc4.7兼容的标题修改后可能更高版本: https://www.udacity.com/wiki/cs344/troubleshoot_gcc47
答案 12 :(得分: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手册进行用户配置,但它是最适合我的解决方案。
答案 13 :(得分:2)
Gearoid Murphy的解决方案就像一个魅力。对我来说,我有两个目录为cuda -
/usr/local/cuda
/usr/local/cuda-5.0
软链接只能添加到下面提到的目录中 -
/usr/local/cuda
此外,正如SchighSchagh所提到的那样,g ++和gcc软链接都是必需的。
答案 14 :(得分: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。
答案 15 :(得分:0)
在$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&lt; = 6.5
或
--std=c++11
代表CUDA&gt; = 7.0。
答案 16 :(得分: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
这样做的好处是不修改整个系统或只对二进制文件进行符号链接(这可能会导致库链接问题。)
答案 17 :(得分: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++
答案 18 :(得分:0)
之所以发生这种情况,是因为您当前的CUDA版本不支持您当前的GCC版本。您需要执行以下操作:
找到受支持的GCC版本(在我的情况下为CUDA 9,为5)
安装支持的GCC版本
sudo apt-get install gcc-5
sudo apt-get install g++-5
更改/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++
更改/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++
将-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"
]
删除旧的构建目录
rm -rd build/
通过设置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
答案 19 :(得分:0)
对于CUDA 6.5(显然是7.0和7.5),我创建了gcc 4.8.5 RPM软件包的版本(在Fedora Core 30下),该版本的gcc可以与系统当前的GCC一起安装。 / p>
您可以找到所有这些信息here。
答案 20 :(得分: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
请确认软件包名称与您要从安装中删除的版本匹配。
我不得不从空白的cmake
目录中重新运行BUILD
,以将所有#include
和库重定向到SDK版本(因为旧路径是在现有构建环境中烘焙的)。