【问题标题】:Can't get rid of "warning: command line option ‘-std=c++11’" using nvcc/CUDA/cmake使用 nvcc/CUDA/cmake 无法摆脱“警告:命令行选项‘-std=c++11’”
【发布时间】:2015-01-08 03:31:43
【问题描述】:

当我使用 cmake 编译我的 cuda 代码时,我似乎无法消除以下警告:

cc1: warning: command line option ‘-std=c++11’ is valid for C++/ObjC++ but not for C [enabled by default]

我已将问题归结为编译,而不是我的源代码。这是一个简化(但有效)的示例:

main.cu:

#include <iostream>

int main(void) {
    std::cout << "test" << std::endl;
}

CMakeLists.txt:

cmake_minimum_required(VERSION 3.0.3) 

project(a_test)

find_package(CUDA REQUIRED)

include_directories(
    /usr/local/cuda-6.5/targets/x86_64-linux/include
    )

link_directories(
    /usr/lib/x86_64-linux-gnu
    /usr/lib/python2.7/config-x86_64-linux
    )

set(CUDA_HOST_COMPILATION_CPP ON)
set(CUDA_NVCC_FLAGS -v -std=c++11 -g -Xcompiler -fexceptions -Xcompiler -fPIC)
set(CMAKE_C_FLAGS "-g -fPIC")
set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-std=c++11 -g -fPIC")
set(CUDA_SEPARABLE_COMPILATION ON)

set(
    SRC_FILES
    main.cu
)

cuda_add_executable(
    a_test

    ${SRC_FILES}
    )
target_link_libraries(
    a_test
    ${LD_LIBRARIES}
    )

如果我使用上面的CMakeLists.txt,它仍然默认使用gcc:

#$ "/usr/bin"/gcc-4.8 -D__CUDA_ARCH__=200 -E -x c      -DCUDA_DOUBLE_MATH_FUNCTIONS  -D__CUDACC__ -D__NVCC__ -D__CUDACC_RDC__ -D__CUDANVVM__  -std=c++11 -g -fPIC -g -fexceptions -fPIC -D__CUDA_PREC_DIV -D__CUDA_PREC_SQRT -I"/usr/local/cuda-6.5/include" -I"/usr/local/cuda-6.5/targets/x86_64-linux/include" -I"/usr/local/cuda-6.5/include" "-I/usr/local/cuda-6.5/bin/../targets/x86_64-linux/include"   -m64 -g -gdwarf-2 -o "/tmp/tmpxft_00001eb1_00000000-7_main.cpp2.i" "/tmp/tmpxft_00001eb1_00000000-3_main.cudafe1.gpu"
cc1: warning: command line option ‘-std=c++11’ is valid for C++/ObjC++ but not for C [enabled by default]

如果我将 -ccbin /usr/bin/g++ 添加到 CUDA_NVCC_FLAGS 以尝试强制 nvcc 使用它,它仍会尝试编译为 C。

#$ "/usr/bin"/g++ -D__CUDA_ARCH__=200 -E -x c      -DCUDA_DOUBLE_MATH_FUNCTIONS  -D__CUDACC__ -D__NVCC__ -D__CUDACC_RDC__ -D__CUDANVVM__  -std=c++11 -g -fPIC -g -fexceptions -fPIC -D__CUDA_PREC_DIV -D__CUDA_PREC_SQRT -I"/usr/local/cuda-6.5/include" -I"/usr/local/cuda-6.5/targets/x86_64-linux/include" -I"/usr/local/cuda-6.5/include" "-I/usr/local/cuda-6.5/bin/../targets/x86_64-linux/include"   -m64 -g -gdwarf-2 -o "/tmp/tmpxft_00001f27_00000000-7_main.cpp2.i" "/tmp/tmpxft_00001f27_00000000-3_main.cudafe1.gpu"
cc1: warning: command line option ‘-std=c++11’ is valid for C++/ObjC++ but not for C [enabled by default]

根据CMake docs,这不应该使用c编译吗?

CUDA_HOST_COMPILATION_CPP (Default ON)
-- Set to OFF for C compilation of host code.

有人知道这里到底发生了什么吗?我怎样才能让这个警告消失?这是 nvcc 或 cmake 中的错误吗?

--

我已经找到了以下stackoverflow问题,但他们并没有解决问题:

【问题讨论】:

  • 是的,我明白这一点,但我认为我的 cmake 文件还可以。我刚刚找到答案,见下文。感谢您的回复!

标签: c++11 gcc cuda cmake nvcc


【解决方案1】:

当然,经过数小时的扯头发,发布问题后只需 5 分钟即可得出答案。谢谢ducky...

CMAKE_CXX_FLAGS 中不能有 -std=c++11,因为它似乎在使用 nvcc 编译 c 代码时使用它。

固定 CMakeLists.txt:

cmake_minimum_required(VERSION 3.0.3) 

project(a_test)

find_package(CUDA REQUIRED)

include_directories(
    /usr/local/cuda-6.5/targets/x86_64-linux/include
    )

link_directories(
    /usr/lib/x86_64-linux-gnu
    /usr/lib/python2.7/config-x86_64-linux
    )

set(CUDA_HOST_COMPILATION_CPP ON)
set(CUDA_NVCC_FLAGS -std=c++11 -g -Xcompiler -fexceptions -Xcompiler -fPIC)
set(CMAKE_C_FLAGS "-g -fPIC")
set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-g -fPIC")
set(CUDA_SEPARABLE_COMPILATION ON)

set(
    SRC_FILES
    main.cu
)

cuda_add_executable(
    a_test

    ${SRC_FILES}
    )
target_link_libraries(
    a_test
    ${LD_LIBRARIES}
    )

我将向 cmake 人员提交一个错误。

编辑:这意味着如果您尝试使用 -std=c++11 编译任何 cpp 文件,您只需要忍受警告(暂时)

【讨论】:

  • 是的。这解决了 2 周的问题
  • 那么,当您实际上还需要使用 g++ 编译 C++11 代码时呢?另外,您最终是否向 CMake 人员提交了错误?
猜你喜欢
  • 1970-01-01
  • 2016-01-15
  • 2016-06-19
  • 1970-01-01
  • 1970-01-01
  • 2014-07-06
  • 2016-11-20
  • 1970-01-01
  • 2013-12-09
相关资源
最近更新 更多