Mam dość dużą aplikację skonfigurowaną w cmake. Niedawno dodałem kilka klas, które wykorzystują funkcjonalność C++ 0x, i łamią kompilację, ponieważ cmake nie jest skonfigurowany do kompilacji z obsługą C++ 0x. Jak mogę dodać tę opcję jako opcję cmake?dodaj obsługę C++ 0x w cmake
Odpowiedz
Trzeba dodać flagę CMAKE_CXX_FLAGS
:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
Używam tego urywek dla gcc, ale jest to bardziej skomplikowany sposób
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()
Mam następujący moduł:
$ 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)
Używam tego do sprawdzenia, czy podzbiór C++ 11 używam (obecnie jest to zbyteczne, ponieważ jestem śpiewaj dużo więcej), jest obsługiwany przez kompilator. Łatwo to zbudować i dodać więcej funkcji, i dodać inne przełączniki kompilatora. Właściwie to jedynymi kompilatorami, które znalazłem do tej pory, które zdały ten test, jest gcc> = 4.6 i clang> = 3.1, jeśli dobrze pamiętam.
Jak pokazano w artykule this answer, lepiej jest użyć target_compile_features
, aby wymagać obsługi określonych funkcji, których potrzebujesz.
To wyjaśnia/dokumentuje, jakie funkcje wymaga twój kod, jest kompatybilne z wieloma platformami i da użytkownikowi bardziej przydatny komunikat o błędzie, jeśli wymagana funkcja nie jest dostępna w ich kompilatorze.
Z manual page dla tej opcji:
target_compile_features
Add spodziewane cechy kompilator cel.
target_compile_features(<target> <PRIVATE|PUBLIC|INTERFACE> <feature> [...])
Określa funkcje kompilatora wymagane podczas kompilowania danego celu. Jeśli funkcja nie jest wymieniona w zmiennej CMAKE_C_COMPILE_FEATURES lub CMAKE_CXX_COMPILE_FEATURES, wówczas zostanie zgłoszony błąd przez CMake. Jeśli użycie funkcji wymaga dodatkowej flagi kompilatora, , takiej jak
-std=gnu++11
, flaga zostanie dodana automatycznie.
Lista funkcji, które można przetestować za pomocą tego makra, to: (here).
- 1. Używanie C++ 0x w projekcie Xcode 4.2 za pomocą CMake
- 2. Dodaj niestandardowy krok kompilacji w CMake
- 3. C++ 0x regex w GCC
- 4. Dodaj obsługę kliknięcia do HorizontalPanel w GWT
- 5. C++ 0x - Kiedy?
- 6. asynchroniczna funkcja C++ 0x
- 7. Wykrywanie trybu C++ 0x w Intel C++?
- 8. Dodaj źródło w podkatalogu do projektu cmake
- 9. CMake dodaj cel do wywoływania analizatora klangów
- 10. Implementacja dobrego C++ 0x error_condition?
- 11. Dodaj obsługę kliknięć do LI bullet
- 12. C++ 0x lambdas styl kodowania
- 13. Jak zwrócić fstream (C++ 0x)
- 14. Dlaczego istnieje operator sizeof ... w C++ 0x?
- 15. Niespójność cech lambda w kompilatorach C++ 0x
- 16. Jak połączyć wartości mieszania w C++ 0x?
- 17. Zwiększenie lambda :: _ 1 w C++ 0x
- 18. Zamknięcie i zagnieżdżone lambdy w C++ 0x
- 19. Wątki w C, C++, C++ 0x, Pthread i zwiększyć
- 20. CMake: dodaj zależność do add_custom_command dynamicznie
- 21. Używanie cmake w oknach dla C++
- 22. Jak włączyć obsługę rozszerzenia C w jRuby?
- 23. Obsługa specyfikacji ++ g ++ i C++ 0x
- 24. C++ 0x obiektowe wnioskowanie obiektowe obiektu
- 25. C++ 0x emplace_back z non-copyable Rzeczy
- 26. enable_shared_from_this (C++ 0x): co robię źle?
- 27. Jaka jest twoja ulubiona funkcja C++ 0x?
- 28. Minimalna wersja iOS, która obsługuje C++ 0x
- 29. Instrukcja obsługi standardowej biblioteki C++ 0x
- 30. Czy ta optymalizacja C++ 0x jest legalna?
Jeśli używasz nowszego kompilatora, powinieneś użyć '-std = C++ 11'. To już nie jest szkic. –