Cmake: установка уровней предупреждений для C и кода C ++ отдельно для MSV C (Visual C ++) - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь контролировать предупреждения компилятора отдельно для C и кода C ++ в сборке на основе cmake:

Для g cc и clang я могу установить дополнительные флаги, которые применяются только к компилятор C, как это с TARGET_COMPILE_OPTIONS:

target_compile_options(MyLib PRIVATE 
                       $<$<AND:$<COMPILE_LANGUAGE:C>,$<NOT:$<CXX_COMPILER_ID:MSVC>>>: -Wall>)

Теперь я хочу сделать то же самое, но для MSV C: $<$<AND:$<COMPILE_LANGUAGE:C>,$<CXX_COMPILER_ID:MSVC>>: /W4>

Это не работает - - похоже, что COMPILE_LANGUAGE:C игнорируется сборками на основе MSV C в смешанных проектах C / C ++. Я тестирую Visual Studio 2019.

Есть ли у кого-нибудь решение для этого?
(кроме использования отдельной цели для кода C)

1 Ответ

2 голосов
/ 17 июня 2020

... похоже, что COMPILE_LANGUAGE:C игнорируется сборками на основе MSV C в смешанных проектах C / C ++.

Да, Документация CMake подтверждает ваши выводы:

Обратите внимание, что с генераторами Visual Studio и Xcode нет способа представить определения компиляции целевого уровня или включить каталоги отдельно для языков C и CXX. Кроме того, с генераторами Visual Studio нет возможности отдельно представлять целевые флаги для языков C и CXX. В этих генераторах выражения для источников C и C ++ будут оцениваться с использованием CXX, если есть какие-либо источники C ++, и в противном случае с использованием C. Обходной путь - вместо этого создать отдельные библиотеки для каждого языка исходного файла

В качестве альтернативы разделению целей для C и кода C ++ вы можете разделить списки источников, и примените свойства для источников :

set(MY_LIB_C_SOURCES ...)
set(MY_LIB_CXX_SOURCES ...)

add_library(MyLib ${MY_LIB_C_SOURCES} ${MY_LIB_CXX_SOURCES})

# Set properties only for C source files
set_source_files_properties(${MY_LIB_C_SOURCES} PROPERTIES
  COMPILE_OPTIONS "$<NOT:$<CXX_COMPILER_ID:MSVC>>: -Wall>"
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...