Ich habe eine ziemlich große Anwendung in cmake konfiguriert. Ich habe vor kurzem ein paar Klassen hinzugefügt, die C++ 0x-Funktionalität verwenden, und es bricht den Build, da cmake nicht für die Kompilierung mit C++ 0x-Unterstützung konfiguriert ist. Wie füge ich das als Option zu cmake hinzu?hinzufügen C++ 0x Unterstützung in cmake
Antwort
Sie müssen die Fahne CMAKE_CXX_FLAGS
hinzuzufügen:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
ich für gcc verwenden diese Schnipsel, aber es ist ein komplizierter Weg
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()
Ich habe folgendes Modul:
$ 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)
Ich verwende dies, um zu überprüfen, ob die Teilmenge von C++ 11 ich verwende (eigentlich ist das jetzt redundant, wie ich u singen viel mehr), wird vom Compiler unterstützt. Es ist einfach, dies weiter zu entwickeln und weitere Features hinzuzufügen und andere Compiler-Switches hinzuzufügen. Tatsächlich ist der einzige Compiler, den ich bisher gefunden habe, der diesen Test besteht, gcc> = 4.6 und clang> = 3.1, wenn ich mich richtig erinnere.
Wie in this answer gezeigt, ist es besser, target_compile_features
zu verwenden, um Unterstützung für die spezifischen Funktionen zu benötigen, die Sie benötigen.
Dies erklärt/dokumentiert besser, welche Funktionalität Ihr Code erfordert, ist plattformübergreifend kompatibel und gibt dem Benutzer eine hilfreichere Fehlermeldung, wenn die erforderliche Funktion in ihrem Compiler nicht verfügbar ist.
Vom manual page für diese Option:
target_compile_features
Add erwartet Compiler-Feature zu einem Ziel.
target_compile_features(<target> <PRIVATE|PUBLIC|INTERFACE> <feature> [...])
Angeben von Compiler-Features, die beim Kompilieren eines bestimmten Ziels erforderlich sind. Wenn das Merkmal nicht in der Variablen CMAKE_C_COMPILE_FEATURES oder CMAKE_CXX_COMPILE_FEATURES aufgelistet ist, wird ein Fehler von CMake gemeldet. Wenn die Verwendung des Features ein zusätzliches Compiler-Flag, wie
-std=gnu++11
erfordert, wird das Flag automatisch hinzugefügt.
Die (hoffentlich vollständige) Liste der Funktionen, die mit diesem Makro getestet werden können, ist here.
- 1. Unicode-Unterstützung in C++ 0x
- 2. g ++ und C++ 0x Spezifikation Unterstützung
- 3. Wie Boost mit C++ 0x Unterstützung erstellen?
- 4. Bibliothekspläne für C++ 0x?
- 5. C++ 11-Unterstützung in NVCC mit CMake auslösen
- 6. C++ 0x regex in GCC
- 7. C++ 0x threading
- 8. C++ 0x: Speicherordnungs
- 9. Vorlage typedef C++ 0x
- 10. C++ 0x Lambda-Overhead
- 11. asynchrone Funktionsaufruf C++ 0x
- 12. C++ 0x Initialisierungsliste Beispiel
- 13. C++ CMake (nicht integrierte Dateien hinzufügen)
- 14. C++ 0x "Standard-Layout"
- 15. Verwenden von GCC C++ 0x-Modus in der Produktion?
- 16. Hinzufügen einer Mathematikbibliothek mit CMake
- 17. C++ 0x atomische Template-Implementierung
- 18. stark typisierte C++ 0x Enumerationsvergleich
- 19. C++ 0x: Bereichsüberlastungen für Standardalgorithmen?
- 20. C++ 0x Vorlage Funktion Objektschluss
- 21. Informationen zu C++ 0x-Funktionen
- 22. Thread Destruktoren in C++ 0x vs Boost
- 23. Einheitliche Initialisierung in C++ 0x, wann() statt {}?
- 24. Neue Unicode-Zeichen in C++ 0x
- 25. Flexibilität der Vorlage Alias in C++ 0x
- 26. Closure und verschachtelte Lambdas in C++ 0x
- 27. Übergang zu C++ 0x von C++ 98
- 28. Threads in C, C++, C++ 0x, Pthread und steigern
- 29. Makefile-Modifikation zur Unterstützung von C++ 11
- 30. CMake: wie Cuda zu bestehenden Projekt hinzufügen
Wenn Sie einen neueren Compiler verwenden, sollten Sie stattdessen '-std = C++ 11' verwenden. Es ist kein Entwurf mehr. –