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

18

Решение

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

Другие решения

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

set(CMAKE_C_FLAGS "std=c99")
0

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

set (CMAKE_C_FLAGS "-std=gnu99 ${CMAKE_C_FLAGS}")
-1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector