it-roy-ru.com

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

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

19
Tarc

После создания цели, такой как библиотека или исполняемый файл, поместите такую ​​строку в файл 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, есть ошибка , которая может привести к тому, что функция 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 ()
    
21
David Grayson

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

set(CMAKE_C_FLAGS "std=c99")
0
Suavnkar Mazumder