c++11 - No se puede deshacer de "warning: command line option ''-std=c++ 11''" usando nvcc/CUDA/cmake
gcc (1)
Cuando compilo mi código de cuda con cmake, parece que no puedo obtener la siguiente advertencia para irme:
cc1: warning: command line option ‘-std=c++11’ is valid for C++/ObjC++ but not for C [enabled by default]
Reduje el problema a la compilación, no a mi código fuente. Aquí hay un ejemplo simplificado (pero funcional):
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}
)
Si utilizo el CMakeLists.txt anterior, sigue usando gcc por defecto:
#$ "/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]
y si agrego -ccbin /usr/bin/g++
a CUDA_NVCC_FLAGS
para intentar obligar a nvcc a usarlo, aún así intenta compilar como 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]
De acuerdo con los documentos de CMake esto nunca debería estar usando la compilación c de todos modos?
CUDA_HOST_COMPILATION_CPP (Default ON)
-- Set to OFF for C compilation of host code.
¿Alguien sabe qué demonios está pasando aquí? ¿Cómo puedo hacer que esta advertencia desaparezca? ¿Es esto un error en nvcc o cmake?
-
Ya he encontrado las siguientes preguntas sobre stackflow y no han resuelto el problema:
Por supuesto, después de horas de arrancarme los pelos, solo tardé 5 minutos después de publicar la pregunta para encontrar la respuesta. Gracias patito ...
No puede tener -std=c++11
en CMAKE_CXX_FLAGS
porque parece usar eso al compilar código c usando nvcc.
corregido 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}
)
Voy a presentar un error con la gente de cmake.
Editar: esto significa que si intenta compilar cualquier archivo cpp con -std = c ++ 11, solo tiene que aguantar la advertencia (por ahora)