【问题标题】:Cmake: Set warning levels for C and C++ code individually for MSVC (Visual C++)Cmake:为 MSVC (Visual C++) 分别设置 C 和 C++ 代码的警告级别
【发布时间】:2020-10-07 02:07:17
【问题描述】:

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

对于 gcc 和 clang,我可以使用 TARGET_COMPILE_OPTIONS 设置仅适用于 C 编译器的附加标志:

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

现在我想做同样的事情,但对于 MSVC: $&lt;$&lt;AND:$&lt;COMPILE_LANGUAGE:C&gt;,$&lt;CXX_COMPILER_ID:MSVC&gt;&gt;: /W4&gt;

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

有人对此有解决方案吗?
(不只是为 C 代码使用单独的目标)

【问题讨论】:

  • 旁白:对于 MSVC,我使用了三个笼统的定义来防止 MS 将其政策推向我并掩盖更多相关的警告。 #define _CRT_SECURE_NO_WARNINGS#define _CRT_SECURE_NO_DEPRECATE#define _CRT_NONSTDC_NO_DEPRECATE。我将它们放在每个 C 源文件的顶部,在任何 #include 语句之前。

标签: c++ c visual-c++ cmake compiler-warnings


【解决方案1】:

...在混合 C/C++ 项目中,基于 MSVC 的构建似乎忽略了 COMPILE_LANGUAGE:C

是的,CMake documentation 证实了你的结论:

请注意,使用 Visual Studio 生成器和 Xcode 无法表示目标范围的编译定义或单独包含 CCXX 语言的目录。此外,使用 Visual Studio 生成器无法分别表示 CCXX 语言的目标范围标志。在这些生成器下,如果有任何 C++ 源,则 C 和 C++ 源的表达式将使用 CXX 进行评估,否则使用 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>"
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多