Ответ 1
Если вы хотите указать конкретную версию C++, рекомендуемый способ сделать это с помощью CMake 3.1 и более CXX_STANDARD
CXX_STANDARD_REQUIRED
CXX_EXTENSIONS
целевые свойства CXX_STANDARD
, CXX_STANDARD_REQUIRED
и CXX_EXTENSIONS
или их эквиваленты переменных для указания целевых значений по умолчанию. Подробную информацию можно найти здесь, но короткая версия выглядит примерно так:
cmake_minimum_required(VERSION 3.1)
project(Example)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# ... Define targets, etc. as usual
Затем CMake должен выбрать соответствующий флаг компилятора для запрошенного стандарта C++ на основе того, что поддерживает компилятор, или ошибки, если он не поддерживает запрошенный стандарт.
Следует также отметить, что CMake может обновить цель, чтобы использовать более поздний языковой стандарт, чем тот, который указан его целевым свойством CXX_STANDARD
. Использование требований к компиляции (как упоминалось в ответе @FlorianWolters) может повысить требования к языковым стандартам. Фактически, CMake всегда будет выбирать более сильное языковое требование, указанное либо целевым свойством CXX_STANDARD
либо требованиями к компиляции, установленными на целевом объекте. Также обратите внимание, что документация CMake по 3.10.1 не точно отражает то, как CXX_EXTENSIONS
взаимодействует с функциями компиляции, поскольку CXX_EXTENSIONS
вступает в силу, если CXX_STANDARD
также указан для большинства распространенных компиляторов (поскольку они указаны вместе с одним флагом компилятора).