CMake имеет встроенную поддержку всех вещей, которые вы пытаетесь решить с помощью явной спецификации флага, поэтому вы должны использовать это вместо:
cmake_minimum_required (VERSION 3.0)
project (foo)
add_executable (first first.cpp)
target_compile_options (first PRIVATE -std=c++11)
target_compile_definitions (first PRIVATE BOOST_ERROR_CODE_HEADER_ONLY)
target_link_libraries (first pthread)
Если вы можете увеличить минимальные требования к версии CMakeдо версии 3.1, вы можете также заменить жестко закодированный флаг std
на собственный CMake:
cmake_minimum_required (VERSION 3.1)
project (foo)
add_executable (first first.cpp)
set_target_properties (first PROPERTIES
CXX_STANDARD 11
CXX_STANDARD_REQUIRED TRUE
CXX_EXTENSIONS FALSE
)
target_compile_definitions (first PRIVATE BOOST_ERROR_CODE_HEADER_ONLY)
target_link_libraries (first pthread)
Преимущество заключается в том, что не все компиляторы выражают «использовать C ++ 11 без расширений» одинаково, иCMake переведет требование в правильные для вас флаги.
Если вам понадобится одна и та же установка C ++ 11 для многих исполняемых файлов, вы можете вместо этого установить переменные CMake, которые предварительно заполняют свойства.Обратите внимание, что переменные должны быть установлены до того, как будут созданы исполняемые файлы:
set (CMAKE_CXX_STANDARD 11)
set (CMAKE_CXX_STANDARD_REQUIRED TRUE)
set (CMAKE_CXX_EXTENSIONS FALSE)
add_executable (first first.cpp)
target_compile_definitions (first PRIVATE BOOST_ERROR_CODE_HEADER_ONLY)
target_link_libraries (first pthread)
add_executable (second second.cpp)
target_compile_definitions (second PRIVATE BOOST_ERROR_CODE_HEADER_ONLY)
target_link_libraries (second pthread)
# ... and so on