我正在尝试在基于 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,无法表示目标范围的编译定义或分别包含
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>"
)