добавить поддержку c ++ 0x в cmake

У меня довольно большое приложение, настроенное в cmake. Недавно я добавил пару классов, которые используют функциональность C ++ 0x, и это нарушает сборку, поскольку cmake не настроен для компиляции с поддержкой C ++ 0x. Как мне добавить это в качестве опции для cmake?

12

Решение

Вам нужно добавить флаг CMAKE_CXX_FLAGS:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
10

Другие решения

Я использую этот фрагмент для GCC, но это более сложный способ

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()
7

У меня есть следующий модуль:

$ 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)

Я использую это, чтобы проверить, поддерживается ли компилятор подмножеством C ++ 11, которое я использую (на самом деле это сейчас избыточно, поскольку я использую намного больше). Это легко построить дальше, добавить больше возможностей и добавить другие ключи компилятора. На самом деле единственные компиляторы, которые я нашел до сих пор, которые проходят этот тест, это gcc> = 4.6 и clang> = 3.1, если я правильно помню.

0

Как показано в этот ответ, лучше использовать target_compile_features требовать поддержки для конкретных функций, которые вам нужны.

Это лучше объясняет / документирует, какие функции требует ваш код, является кросс-платформенным и дает пользователю более полезное сообщение об ошибке, если требуемая функция недоступна в его компиляторе.

От страница справочника для этого варианта:

target_compile_features

Добавьте ожидаемые функции компилятора к цели.

target_compile_features(<target> <PRIVATE|PUBLIC|INTERFACE> <feature> [...])

Укажите функции компилятора, необходимые при компиляции заданной цели. Если
функция не указана в переменной CMAKE_C_COMPILE_FEATURES или
Переменная CMAKE_CXX_COMPILE_FEATURES, тогда ошибка будет сообщена
CMake. Если для использования этой функции требуется дополнительный флаг компилятора,
такие как -std=gnu++11, флаг будет добавлен автоматически.

(Надеемся, что полный) список функций, которые можно протестировать с помощью этого макроса Вот.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector