CUDA 8 使用 -std=gnu++11 编译错误

Posted

技术标签:

【中文标题】CUDA 8 使用 -std=gnu++11 编译错误【英文标题】:CUDA 8 compile errors with -std=gnu++11 【发布时间】:2017-10-24 03:01:27 【问题描述】:

我正在尝试将一些代码转换为使用 CUDA,但我认为我遇到了兼容性问题。我们使用 CMake。这些是我使用的 gcc 和 CUDA 版本:

$ gcc --version
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.5) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2016 NVIDIA Corporation
Built on Tue_Jan_10_13:22:03_CST_2017
Cuda compilation tools, release 8.0, V8.0.61

在 CMakeLists.txt 文件中,这是设置的:

SET(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS -std=gnu++11")

当我编译时,我得到这个错误:

/usr/lib/gcc/x86_64-linux-gnu/5/include/stddef.h(436): error: identifier "nullptr" is undefined

/usr/lib/gcc/x86_64-linux-gnu/5/include/stddef.h(436): error: expected a ";"

/usr/include/x86_64-linux-gnu/c++/5/bits/c++config.h(200): error: expected a ";"

/usr/include/c++/5/exception(63): error: expected a ";"

/usr/include/c++/5/exception(68): error: expected a ";"

/usr/include/c++/5/exception(76): error: expected a ";"

/usr/include/c++/5/exception(83): error: expected a ";"

/usr/include/c++/5/exception(93): error: expected a ""
...

我找到了this discussion,它说将 C++ 标志更改为 -std=c++98,但这不适用于项目,因为它广泛使用了 C++11 代码。有解决方案吗?这似乎不是一个独特的问题,但我似乎找不到解决方案...

这是我运行cmake 时的输出,所以我知道它确实使用的是 gcc 5.4 而不是其他版本。

-- The C compiler identification is GNU 5.4.0
-- The CXX compiler identification is GNU 5.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Looking for pthread.h
-- Looking for pthread.h - found
-- Looking for pthread_create
-- Looking for pthread_create - not found
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - found
-- Found Threads: TRUE  
-- Found CUDA: /usr/local/cuda (found version "8.0") 
-- Found OpenCV: /usr/local (found version "3.2.0") 
-- Found PythonLibs: /usr/lib/x86_64-linux-gnu/libpython2.7.so (found suitable version "2.7.12", minimum required is "2.7") 
-- Found PythonInterp: /usr/bin/python2.7 (found version "2.7.12") 
-- Boost version: 1.58.0
-- Found the following Boost libraries:
--   python
-- Configuring done
-- Generating

【问题讨论】:

使用std=c++11?我看不出这与 CUDA 有什么关系 谢谢@talonmies,我认为这解决了它......你是对的,它可能不是 CUDA 的问题,但这是我想要添加的,所以得出结论我遇到了 CUDA 问题。如果没有您的建议,就不会知道搜索/使用 std=c++11。 您介意添加您的解决方案作为答案吗? @talonmies 完成,谢谢。 另外,在多编译器环境中,/usr/bin/cc 可能不指向您应该使用的 gcc 版本。只需启动 readlink -e /usr/bin/cc 即可 100% 确定它指向您想要的 gcc 版本。 $(readlink -e /usr/bin/cc) --version 是单线的。 【参考方案1】:

如果您愿意需要更新版本的 CMake,更便携的解决方案是

cmake_minimum_required(VERSION 3.1.3)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)  # not necessary, but encouraged

我大约 90% 确定它与 v3.1.3 一起出现。请确保在创建任何特定目标之前之前设置此设置(例如,cuda_add_librarycuda_add_executable)。

另请注意,如果您使用传统的 find_package(CUDA)cuda_add_library 等,您可能还需要

set(CUDA_PROPAGATE_HOST_FLAGS ON)

否则nvcc 默认不会继承这些定义。

【讨论】:

【参考方案2】:

一个简单的改变

SET(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS -std=gnu++11")

SET(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS -std=c++11")

解决了我的问题。感谢 talonmies 的解决方案。

【讨论】:

以上是关于CUDA 8 使用 -std=gnu++11 编译错误的主要内容,如果未能解决你的问题,请参考以下文章

TensorRT安装

编译GCC4.8.2

在python 3.8 / CUDA 11环境下安装tensorflow 1.15

我可以在 Windows7x64 (MSVC) 和 Linux64 (GCC4.8.2) 的 .cu 文件 (CUDA5.5) 中使用 C++11 吗?

caffe:编译时提示:unsupported GNU version! gcc versions later than 4.9 are not supported!

如何查看 GNU make 运行的命令?