Я искал портативный способ заставить CMake включить функции C99 компилятора, чтобы избежать следующих gcc
ошибка, например:
error: ‘for’ loop initial declarations are only allowed in C99 mode
for (int s = 1; s <= in_para->StepNumber; s++){
^
Я также не хотел бы проверять какой компилятор и добавлять что-то вроде:
set(CMAKE_C_FLAGS "-std=c99") # that would be bad
Итак, я нашел этот пост: Включение C99 в CMake и запрос связанной функции: 0012300: у CMake нет кроссплатформенного способа запрашивать C99. В этой ошибке богомола я узнал о target_compiler_features
и после этого я нашел эти ответы SOF на это: Как активировать C ++ 11 в CMake? а также Как определить поддержку C ++ 11 компилятора с CMake.
Итак, мои вопросы: это target_compiler_features
предоставит способ требовать функции C, а также C ++? Какой самый портативный способ добиться этого на данный момент — я сейчас использую CMake 2.8.12.2. target_compiler_features
отсутствует в последней версии CMake (3.0.0). Вы знаете, когда он будет выпущен?
После создания цели, такой как библиотека или исполняемый файл, поместите такую строку в файл CMakeLists.txt:
set_property(TARGET tgt PROPERTY C_STANDARD 99)
где tgt
это имя вашей цели.
Я думаю, что это было добавлено в CMake 3.1, и документация здесь:
http://www.cmake.org/cmake/help/v3.1/prop_tgt/C_STANDARD.html
Если вам нужно поддерживать версии CMake старше 3.1, вы можете использовать этот макрос:
macro(use_c99)
if (CMAKE_VERSION VERSION_LESS "3.1")
if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
set (CMAKE_C_FLAGS "-std=gnu99 ${CMAKE_C_FLAGS}")
endif ()
else ()
set (CMAKE_C_STANDARD 99)
endif ()
endmacro(use_c99)
После помещения этого макроса в файл верхнего уровня, чтобы он был виден везде, вы можете просто написать use_c99()
в верхней части любого файла CMakeLists, который определяет цель с кодом C99 в нем.
Если вы используете CMake и Clang для MacOS, есть ошибка что может вызвать CMAKE_C_STANDARD
возможность просто не работать (не добавлять флаги компилятора). Убедитесь, что вы делаете одну из следующих вещей:
Установите для политики CMP0025 значение NEW с помощью следующего кода в верхней части файла CMakeLists.txt до project
команда:
# Fix behavior of CMAKE_C_STANDARD when targeting macOS.
if (POLICY CMP0025)
cmake_policy(SET CMP0025 NEW)
endif ()
Добавьте следующее в ваш файл CMakeLists.txt и снова запустите cmake
set(CMAKE_C_FLAGS "std=c99")
В libevent добавьте следующее в CMakeLists.txt
set (CMAKE_C_FLAGS "-std=gnu99 ${CMAKE_C_FLAGS}")