Cmake:为 C 设置警告级别,并为 MSVC 单独设置C++代码(Visual C++)



我正在尝试在基于 cmake 的构建中单独控制 C 和C++代码的编译器警告:

对于 gcc 和 clang,我可以像这样设置仅适用于 C 编译器的其他标志TARGET_COMPILE_OPTIONS

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

现在我想做同样的事情,但对于 MSVC:$<$<AND:$<COMPILE_LANGUAGE:C>,$<CXX_COMPILER_ID:MSVC>>: /W4>

这是行不通的 - 似乎COMPILE_LANGUAGE:C混合C/C++项目中基于MSVC的构建忽略了它。我正在使用Visual Studio 2019进行测试。

有人对此有解决方案吗?
(除了为 C 代码使用单独的目标(

...似乎COMPILE_LANGUAGE:C被混合 C/C++ 项目中基于 MSVC 的构建所忽略。

是的,CMake 文档证实了您的结论:

请注意,使用 Visual Studio 生成器和 Xcode,无法表示目标范围的编译定义或分别包含CCXX语言的目录。此外,使用 Visual Studio 生成器,无法分别为CCXX语言表示目标范围的标志。在这些生成器下,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>"
)

最新更新