CMake 버전 3.1.0 이상이있는 경우 C ++ 컴파일러가 지원하는 C ++ 기능을 감지 할 수 있습니다.
cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
project(foobar CXX)
message("Your C++ compiler supports these C++ features:")
foreach(i ${CMAKE_CXX_COMPILE_FEATURES})
message("${i}")
endforeach()
그러나 일반적으로 CMake 스크립트에서 CMake 변수 CMAKE_CXX_COMPILE_FEATURES 를 사용할 필요가 없습니다 . 대신 C ++ 표준을 명시 적으로 지정하거나 필요한 C ++ 기능을 지정하고 C ++ 표준을 유도하여 C ++ 파일을 컴파일해야하는 C ++ 표준을 CMake에 알리는 두 가지 방법이 있습니다. CMake는 C ++ 컴파일러가 올바른 명령 줄 플래그 (예 : -std = c ++ 11)로 호출되는지 확인합니다.
1. 명시 적으로 C ++ 표준 지정
CMake 대상에 대해 CMake 속성 CXX_STANDARD
및
CXX_STANDARD_REQUIRED 를 설정하여 C ++ 표준을 명시 적으로 지정할 수
있습니다.
$ cat /tmp/src/CMakeLists.txt
project(foobar CXX)
cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
add_executable(prog main.cc)
set_property(TARGET prog PROPERTY CXX_STANDARD 11)
set_property(TARGET prog PROPERTY CXX_STANDARD_REQUIRED ON)
$ cat /tmp/src/main.cc
int main() {
return 0;
}
$ mkdir /tmp/build
$ cd /tmp/build
$ cmake /tmp/src
-- The CXX compiler identification is GNU 4.8.2
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /tmp/build
$ make VERBOSE=1 | grep main.cc | grep -- "-c"
/usr/bin/c++ -std=gnu++11 -o CMakeFiles/prog.dir/main.cc.o -c /tmp/src/main.cc
$
2. 필요한 C ++ 기능을 지정하고 CMake가 C ++ 표준을 유도하도록합니다.
CMake 명령 target_compile_features 를 사용하여 CMake 대상에서 사용되는 C ++ 기능을 지정할 수 있습니다 . 이 목록에서 CMake는 사용할 C ++ 표준을 유도합니다. CMake 전역 속성 CMAKE_CXX_KNOWN_FEATURES 는 선택할 수있는 C ++ 기능을 나열합니다.
cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
message("Your CMake version supports these C++ features:")
get_property(known_features GLOBAL PROPERTY CMAKE_CXX_KNOWN_FEATURES)
foreach(i ${known_features})
message("${i}")
endforeach()
예를 들어, main.cc 파일 이름을 가진이 C ++ 프로그램 은 C ++ 11 기능을 사용합니다.
cxx_strong_enums , cxx_constexpr , cxx_auto_type
#include <cstdlib>
int main(int argc, char *argv[]) {
enum class Color { Red, Orange, Yellow, Green, Blue, Violet };
constexpr float a = 3.1415f;
auto b = a;
return EXIT_SUCCESS;
}
이 CMakeLists.txt 파일이 빌드합니다.
cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
project(foobar CXX)
add_executable(foobar main.cc)
set(needed_features
cxx_strong_enums
cxx_constexpr
cxx_auto_type)
target_compile_features(foobar PRIVATE ${needed_features})
add_definitions
을 설정CMAKE_CXX_FLAGS
하는 대신 명령을 사용하는 이유는 무엇 입니까?