2016-04-11 22 views
7

Utilizzo Ubuntu 15.10 con CUDA 7.5. CMmake è v3.2.2, NVCC è la versione 7.5, v7.5.17; GCC è Ubuntu 5.2.1-22ubuntu2 v5.2.1Attivazione del supporto C++ 11 in NVCC con CMake

Triggering C++ 11 in progetti regolari è facile con:

project(foo CXX) 
set(TARGET foo CMAKE_CXX_STANDARD 11) 

sto definendo il mio progetto CUDA con:

find_package(CUDA REQUIRED) 
CUDA_ADD_EXECUTABLE(foo ${foo_src} ${foo_hdr} ${foo_cu}) 

Ma il supporto C++ 11 non viene propagato a NVCC. Devo aggiungere:

list(APPEND CUDA_NVCC_FLAGS "-std=c++11") 

Questo mi sembra un kludge. Evidentemente su questo è stato fatto un lavoro di recente secondo lo this task, ma non sono stato in grado di trovare i risultati.

Come si ottiene CMake per impostare automaticamente i flag C++ 11 quando si dichiara il progetto come C++ 11?

MODIFICA: Sono tornato a questa domanda con CUDA 8.0 e CMake 3.5.1.

Dal documentation, set(CUDA_PROPAGATE_HOST_FLAGS ON) propagherà il contenuto di CMAKE_CXX_FLAGS, quindi la seguente innesca C++ 11 sia per cpp e nvcc:

set (CMAKE_CXX_FLAGS "--std=c++11") 
set (CUDA_PROPAGATE_HOST_FLAGS ON) 

Tuttavia, set(CMAKE_CXX_STANDARD 11) non influisce CMAKE_CXX_FLAGS, quindi la seguente dà compilatore errori per C++ 11 codice del dispositivo, come non c'è niente da diffondere:

set (CMAKE_CXX_STANDARD 11) 
set (CUDA_PROPAGATE_HOST_FLAGS ON) 

io non riesco a trovare una combinazione di comandi CMake che evita impostando esplicitamente --std=c++11 in flag CXX o CUDA.

+0

cercano impostazione CUDA_PROPAGATE_HOST_FLAGS su ON (anche se è suppone sia per impostazione predefinita) e quindi impostare CMAKE_CXX_FLAGS con -std = C++ 11. – Hopobcn

+0

Provato a impostare CUDA_PROPAGATE_HOST_FLAGS su ON. Non ha funzionato Il set di comandi (TARGET foo CMAKE_CXX_STANDARD 11) attiva già il supporto C++ 11 nel compilatore. Sembra ridondante aggiungere set (CMAKE_CXX_FLAGS "-std = C++ 11") in cima a quello. –

+0

Penso che questa funzionalità dipenda dalla tua versione cmake. Nel mio caso con l'impostazione di cmake 3.5.0 'CMAKE_CXX_FLAGS' con' -std = C++ 11' e avendo 'CUDA_PROPAGATE_HOST_FLAGS' si innesca automaticamente cmake per aggiungere' --std C++ 11' (a nvcc). – Hopobcn

risposta

1

Poiché CMake 3.8 (poiché CMake supporta CUDA come lingua), esiste una nuova proprietà di destinazione CUDA_STANDARD. Sebbene il suo nome sia abbastanza confuso, aggiunge il numero -std=XXX al comando di compilazione nvcc.

Con una recente versione di CMake il modo corretto sarebbe

cmake_minimum_required(3.8.2) 
enable_language(CUDA) 
add_executable(foo ${foo_src} ${foo_cu}) 
set_property(TARGET foo PROPERTY CUDA_STANDARD 11)