Ho un'applicazione piuttosto grande configurata in cmake. Di recente ho aggiunto un paio di classi che utilizzano la funzionalità C++ 0x e interrompe la compilazione, dal momento che cmake non è configurato per la compilazione con il supporto C++ 0x. Come posso aggiungerlo come opzione per cmake?aggiungere supporto C++ 0x in cmake
risposta
È necessario aggiungere il flag di CMAKE_CXX_FLAGS
:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
Io uso questo frammento di codice per gcc, ma è un modo più complicato
if(CMAKE_COMPILER_IS_GNUCXX)
SET(ENABLE_CXX11 "-std=c++11")
EXECUTE_PROCESS(COMMAND "${CMAKE_CXX_COMPILER} -dumpversion" OUTPUT_VARIABLE GCC_VERSION)
if (GCC_VERSION VERSION_LESS 4.7)
SET(ENABLE_CXX11 "-std=c++0x")
endif()
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${ENABLE_CXX11}")
endif()
Ho la seguente modulo:
$ cat FindCXX11.cmake
# - Finds if the compiler has C++11 support
# This module can be used to detect compiler flags for using C++11, and checks
# a small subset of the language.
#
# The following variables are set:
# CXX11_FLAGS - flags to add to the CXX compiler for C++11 support
# CXX11_FOUND - true if the compiler supports C++11
#
# TODO: When compilers starts implementing the whole C++11, check the full set
include(CheckCXXSourceCompiles)
include(FindPackageHandleStandardArgs)
set(CXX11_FLAG_CANDIDATES
#Gnu and Intel Linux
"-std=c++0x"
#Microsoft Visual Studio, and everything that automatically accepts C++11
" "
#Intel windows
"/Qstd=c++0x"
)
set(CXX11_TEST_SOURCE
"
class Matrix
{
public:
Matrix(int a, int b, int c, int d)
: data {a, b, c, d}
{}
private:
int data[4];
};
int main()
{
int n[] {4,7,6,1,2};
for (auto i : n)
Matrix mat (3,5,1,2);
return 0;
}
")
foreach(FLAG ${CXX11_FLAG_CANDIDATES})
set(SAFE_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
set(CMAKE_REQUIRED_FLAGS "${FLAG}")
unset(CXX11_FLAG_DETECTED CACHE)
message(STATUS "Try C++11 flag = [${FLAG}]")
check_cxx_source_compiles("${CXX11_TEST_SOURCE}" CXX11_FLAG_DETECTED)
set(CMAKE_REQUIRED_FLAGS "${SAFE_CMAKE_REQUIRED_FLAGS}")
if(CXX11_FLAG_DETECTED)
set(CXX11_FLAGS_INTERNAL "${FLAG}")
break()
endif(CXX11_FLAG_DETECTED)
endforeach(FLAG ${CXX11_FLAG_CANDIDATES})
set(CXX11_FLAGS "${CXX11_FLAGS_INTERNAL}")
find_package_handle_standard_args(CXX11 DEFAULT_MSG CXX11_FLAGS)
mark_as_advanced(CXX11_FLAGS)
Io lo uso per verificare se il sottoinsieme di C++ 11 sto usando (in realtà questo è ridondante ora, come lo sono io canta molto di più), è supportato dal compilatore. È facile crearlo ulteriormente, aggiungere ulteriori funzionalità e aggiungere altre opzioni del compilatore. In realtà gli unici compilatori che ho trovato finora che superano questo test, sono gcc> = 4.6 e clang> = 3.1 se ricordo bene.
Come mostrato in this answer, è meglio utilizzare target_compile_features
per richiedere il supporto per le funzionalità specifiche necessarie.
Questo spiega/documenta meglio le funzionalità richieste dal codice, è multipiattaforma compatibile e fornirà all'utente un messaggio di errore più utile se la funzione richiesta non è disponibile nel compilatore.
Dal manual page per questa opzione:
target_compile_features
aggiuntivo previsto funzionalità del compilatore a un bersaglio.
target_compile_features(<target> <PRIVATE|PUBLIC|INTERFACE> <feature> [...])
Specificare le caratteristiche del compilatore richieste durante la compilazione di un dato obiettivo. Se la funzione non è elencata nella variabile CMAKE_C_COMPILE_FEATURES o nella variabile CMAKE_CXX_COMPILE_FEATURES, un errore verrà segnalato da CMake. Se l'utilizzo della funzione richiede un flag di compilatore aggiuntivo, come
-std=gnu++11
, il flag verrà aggiunto automaticamente.
L'elenco (si spera completo) di funzionalità che è possibile testare con questa macro è here.
- 1. CMake clang and C++ 0x
- 2. Supporto del compilatore per l'imminente C++ 0x
- 3. Esistono aggiornamenti del supporto per la localizzazione in C++ 0x?
- 4. Attivazione del supporto C++ 11 in NVCC con CMake
- 5. supporto per le specifiche g ++ e C++ 0x
- 6. Piani di libreria per C++ 0x?
- 7. Ereditare costruttori in C++ 0x
- 8. C++ 0x regex in GCC
- 9. Funzione "id" in C++ 0x
- 10. Threading C++ 0x
- 11. Utilizzo della modalità C++ 0x di GCC in produzione?
- 12. C++ 0x inizializzazioni statiche e sicurezza filo
- 13. CMake: come aggiungere cuda al progetto esistente
- 14. Nuovi caratteri unicode in C++ 0x
- 15. problema con std :: make_tuple in C++ 0x
- 16. stanno aggiungendo copy_if in C++ 0x?
- 17. eliminazione di funzioni virtuali in C++ 0x
- 18. come cache un lambda in C++ 0x?
- 19. cmake: aggiungere dipendenza non in sottodirectory
- 20. come aggiungere framework a cmake
- 21. Esempio elenco inizializzatore C++ 0x
- 22. Discussioni in C, C++, C++ 0x, pthread e aumentare
- 23. _1 parte di C++ 0x?
- 24. È legale l'ottimizzazione C++ 0x?
- 25. Transizione a C++ 0x da C++ 98
- 26. Supporto multilingue in C#
- 27. Qualsiasi modello RAII in boost o C++ 0x
- 28. Quali compilatori hanno il supporto più avanzato per lo stato corrente di C++ 0x?
- 29. Tipo sottostante di enum C++ in C++ 0x
- 30. Come aggiungere il supporto iPhone5 in cocos2d
Se si utilizza il compilatore più recente, è necessario utilizzare '-std = C++ 11'. Non è più una bozza. –