Не удается избавиться от "warning: command line option ‘ - std=c++11’" с помощью nvcc/CUDA / cmake
Когда я компилирую свой код cuda с cmake, я не могу получить следующее предупреждение, чтобы уйти:
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 использовать его, он все равно попытается скомпилироваться как С.
#$ "/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, и они не решили проблему:
1 ответ:
Конечно, после нескольких часов рвания на себе волос, все, что потребовалось, это 5 минут после публикации вопроса, чтобы выработать ответ. Спасибо Даки ...
Вы не можете иметь
-std=c++11
вCMAKE_CXX_FLAGS
, потому что он, кажется, использует это при компиляции кода c с помощью nvcc.Исправлены 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.
Edit: это означает, что если вы пытаетесь скомпилировать любые cpp-файлы с помощью-std=c++11, Вам просто нужно смириться с тем, что предупреждение (пока)