Как установить стандарт языка (-std) для статического анализатора Clang в Qt Creator

Я пишу свой проект на C, используя QtCreator в качестве IDE и CMake для сборки. QtCreator вер. > = 4.0.0 включает статический анализатор Clang, который я пытаюсь использовать.

В моем наборе CMakeLists.txt:

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

Когда я запускаю анализ в консоли, получаю ошибки:

error: invalid argument '-std=gnu++11' not allowed with 'C/ObjC'

Как передать '-std = gnu99' анализатору clang? Может быть, это жестко запрограммировано в исходниках плагина QtCreator?

UDP1: похоже, это ошибка QtCreator: https://bugreports.qt.io/browse/QTCREATORBUG-16290


person trafalgarx    schedule 17.08.2016    source источник
comment
Как вы указали проект CMake? Когда вы делаете только C, используйте project(myProject LANGUAGES C). Это укажет CMake не рассматривать компилятор C ++.   -  person Torbjörn    schedule 18.08.2016
comment
@ Torbjörn Да, я установил язык в команде проекта. Также обратите внимание, что для CMake ver. ‹3.0 нужно написать project(myProject C)   -  person trafalgarx    schedule 18.08.2016


Ответы (2)


Переменная CMAKE_C_FLAGS предназначена для кода C, а не для кода C++. Вместо этого вы должны добавить его в CMAKE_CXX_FLAGS.

set(CMAKE_CXX_FLAGS "-std=gnu++11 ${CMAKE_CXX_FLAGS}")

и чтобы сохранить -std=gnu99 для кода C, вы должны добавить:

set(CMAKE_C_FLAGS "-std=gnu99 ${CMAKE_C_FLAGS}") 
person Petesh    schedule 17.08.2016
comment
… Хотя это менее чем желательный способ сделать это - вы должны использовать _ 1_, хотя семантика мне кажется довольно тупой - person Petesh; 17.08.2016

Классический подход представлен в ответе @Petesh.

Если вы просто хотите указать точную стандартную версию C, которой должен соответствовать компилятор, используйте глобальные переменные _ 1_ и CMAKE_C_STANDARD_REQUIRED.

В вашем случае это было бы

set(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED TRUE)

Затем CMake самостоятельно определит точные параметры команды для обнаруженного компилятора и добавит их ко всем вызовам компилятора.

Чтобы перезаписать этот глобальный параметр для конкретной цели, измените соответствующие свойства цели:

set_target_properties(myTarget
                      PROPERTIES C_STANDARD 11
                                 C_STANDARD_REQUIRED ON)

Подробное описание параметров функции компиляции приведено в официальной документации CMake: целевые функции компиляции. С помощью этих функций компиляции также можно потребовать, чтобы обнаруженный компилятор поддерживал определенный набор языковых функций независимо от языкового стандарта:

target_compile_features(myTarget
                        PUBLIC c_variadic_macros  # ISO/IEC 9899:1999
                        PRIVATE c_static_assert   # ISO/IEC 9899:2011
)
person Torbjörn    schedule 18.08.2016
comment
Как найти эту информацию в руководстве? Кажется, у CMake миллионы переменных, и мне просто нужно угадать это или искать их в SO. - person nowox; 24.08.2017
comment
@nowox Это начальная страница для функций компиляции. Он находится на главной странице официальной документации CMake, которая за последние годы значительно улучшилась. - person Torbjörn; 24.08.2017
comment
Имейте в виду, что это для стандарта C, а не для стандарта C++, который определяется переменной CMAKE_CXX_STANDARD. Проблема, с которой столкнулся OP, была связана с установкой стандартных флагов для компилятора C, а не для компилятора C ++. - person Petesh; 05.03.2020