Принуждение C99 в CMake (для использования "для" начального объявления цикла)

Я искал переносимый способ заставить 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. В этой ошибке Mantis я узнал о 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). Знаете ли вы, когда он будет выпущен?

Ответы

Ответ 1

После создания цели, такой как библиотека или исполняемый файл, поместите такую строку в файл 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 выпуск № 15943 для пользователей clang, ориентированных на macOS

Если вы используете CMake и clang для нацеливания на MacOS, существует ошибка bug, которая может привести к тому, что функция CMAKE_C_STANDARD просто не будет работать (не добавлять какие-либо флаги компилятора). Убедитесь, что вы делаете одно из следующих действий:

  • Используйте cmake_minimum_required, чтобы потребовать CMake 3.0 или новее, или
  • Установите для политики CMP0025 значение NEW с помощью следующего кода в верхней части файла CMakeLists.txt перед командой project:

    # Fix behavior of CMAKE_C_STANDARD when targeting macOS.
    if (POLICY CMP0025)
      cmake_policy(SET CMP0025 NEW)
    endif ()
    

Ответ 2

Редактировать CMakeLists

добавить на линии> 2

set (CMAKE_C_STANDARD 99)

затем

cmake 3 ..

Ответ 3

Добавьте в файл CMakeLists.txt следующее и снова запустите cmake

set(CMAKE_C_FLAGS "std=c99")

Ответ 4

В libevent добавьте следующее в CMakeLists.txt

set (CMAKE_C_FLAGS "-std=gnu99 ${CMAKE_C_FLAGS}")