Как запросить C ++ 11 или более позднюю версию на CMake-target? - PullRequest
0 голосов
/ 16 января 2019

(Этот вопрос действительно о части "или позже".)

Мне известны другие ответы, которые говорят нам активировать C ++ 11 для цели / проекта в cmake.

Мой вопрос на самом деле, как мы можем выразить C ++ 11 или более позднюю версию.

Начиная с CMake 3.8, у нас есть cxx_std_11 -функция, которая заставляет C ++ 11 на компиляторах (-std=c++11), которые даже поддерживают более поздние стандарты и могут даже по умолчанию использовать C ++ 14 (gcc-7) или даже 17 (gcc-8, iiuc).

Существует также свойство CXX_STANDARD-target-свойство, но оно не является транзитивным и также устанавливает точный стандарт, а не опцию «или позже».

Единственный способ, который я нашел до сих пор, - это потребовать cxx_range_for (или аналогичную функцию), которая заставляет CMake поддерживать стандарт C ++ по умолчанию для компилятора, если поддерживается хотя бы C ++ 11. Это поддерживается с CMake 3.1.

Как правильно выбрать C ++ 11 или более позднюю версию CMake-target?

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Как заметил программист @Some, единственный способ сделать это - проверить C ++ 17, затем C ++ 14, затем C ++ 11. Изучение исходных текстов CMake дает интересную идею о том, как сделать это независимо от платформы. Здесь try_compile команда используется с соответствующим переданным CMAKE_CXX_STANDARD, поэтому CMake сам определяет, какой флаг компилятора следует использовать. Таким образом, чтобы проверить на C ++ 14:

try_compile(CMake_CXX14_WORKS
  ${CMAKE_CURRENT_BINARY_DIR}
  ${CMAKE_CURRENT_LIST_DIR}/cm_cxx14_check.cpp
  CMAKE_FLAGS -DCMAKE_CXX_STANDARD=14
  OUTPUT_VARIABLE OUTPUT
  )

где cm_cxx14_check.cpp - фиктивный файл с main.

Это ключевая идея, хотя полная логика также проверяет, был ли CMAKE_CXX_STANDARD еще не определен или CMake знает CMAKE_CXX_STANDARD=17 (CMake> = 3.8). Кроме того, CMake проверяет наличие новейших стандартов только для GNU или Clang, но я полагаю, что это потому, что он не нужен в MSVC для небиблиотечного кода. MSVC всегда включал новейший стандарт по умолчанию.

К сожалению, здесь также есть угловой пример с GNU 4.8: "Заголовок cstdio стандартной библиотеки GNU 4.8 не знает, что C ++ 14 учитывает удаление C11" gets "из stdio.h и приводит к ошибка "

0 голосов
/ 16 января 2019

К сожалению, в CMake нет способа запросить диапазон стандартов.

Тогда единственный способ (который я использовал в прошлом) - использовать, например, check_cxx_compiler_flag для проверки -std=c++20, -std=c++17, -std=c++14 и -std=c++11 (в таком порядке) и использования самого высокого с, например, target_compile_options.

Если ни один из перечисленных флагов не поддерживается, выдается ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...