2016-04-11 8 views
7

Ich benutze Ubuntu 15.10 mit CUDA 7.5. CMmake ist v3.2.2, NVCC ist Version 7.5, v7.5.17; GCC ist Ubuntu 5.2.1-22ubuntu2 v5.2.1C++ 11-Unterstützung in NVCC mit CMake auslösen

Triggern C++ 11 in regelmäßigen Projekten ist einfach mit:

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

ich mein CUDA-Projekt mit der Definition:

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

Die C++ 11-Unterstützung wird jedoch nicht an NVCC weitergegeben. Ich muss hinzufügen:

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

Dies scheint wie ein Kludge. Es wurde offensichtlich kürzlich nach this task daran gearbeitet, aber ich konnte die Ergebnisse nicht finden.

Wie bekomme ich CMake automatisch die C++ 11 Flags beim Deklarieren des Projekts als C++ 11 setzen?

EDIT: Ich habe auf diese Frage mit CUDA 8.0 und CMake 3.5.1 neu abgestimmt.

Vom documentation, set(CUDA_PROPAGATE_HOST_FLAGS ON) wird der Inhalt von CMAKE_CXX_FLAGS, propagieren, so dass die folgenden Trigger C 11 ++ sowohl für CPP und nvcc:

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

jedoch set(CMAKE_CXX_STANDARD 11) nicht CMAKE_CXX_FLAGS auswirken, so dass die folgenden werden Compiler Fehler für C++ 11 Gerätecode, da gibt es nichts zu propagieren:

set (CMAKE_CXX_STANDARD 11) 
set (CUDA_PROPAGATE_HOST_FLAGS ON) 

ich kann nicht scheinen, eine Kombination von CMake Befehle zu finden, die explizit 01 Einstellung vermeidetin entweder CXX oder CUDA Flags.

+0

versuchen CUDA_PROPAGATE_HOST_FLAGS auf ON (obwohl es suposed ist standardmäßig aktiviert sein) und setzen dann CMAKE_CXX_FLAGS mit -std = C++ 11. – Hopobcn

+0

Die Einstellung CUDA_PROPAGATE_HOST_FLAGS wurde auf ON gesetzt. Hat nicht funktioniert. Der Befehlssatz (TARGET foo CMAKE_CXX_STANDARD 11) löst bereits C++ 11-Unterstützung im Compiler aus. Es scheint redundant zu sein, Set (CMAKE_CXX_FLAGS "-std = C++ 11") hinzuzufügen. –

+0

Ich denke diese Funktionalität hängt von deiner cmake Version ab. In meinem Fall mit cmake 3.5.0 Einstellung 'CMAKE_CXX_FLAGS' mit' -std = C++ 11' und mit 'CUDA_PROPAGATE_HOST_FLAGS' wird automatisch cmake ausgelöst um' --std C++ 11' (zu nvcc) hinzuzufügen. – Hopobcn

Antwort

1

Seit CMake 3.8 (da CMake CUDA als Sprache unterstützt) gibt es eine neue Zieleigenschaft CUDA_STANDARD. Obwohl der Name ziemlich verwirrend ist, fügt er den -std=XXX zum nvcc Kompilierbefehl hinzu.

Mit einer aktuellen CMake Version der richtige Weg wäre

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