本质上,这是对早期问题 这里 的一种更现代的方法,您可以使用if语句检查编译器类型,并根据其设置编译标志:
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
# Disable a Clang warning type.
target_compile_options(MyLib PRIVATE -Wno-unused-variable)
elseif(MSVC)
# Disable a MSVC warning type.
target_compile_options(MyLib PRIVATE /wd4101)
endif()
要将此放入单个表达式中,您可以使用 CMake 生成器表达式(在 CMake 构建系统生成阶段评估):
target_compile_options(MyLib PRIVATE
"$<IF:$<STREQUAL:${CMAKE_CXX_COMPILER_ID},Clang>,-Wno-unused-variable,/wd4101>"
)
以下是clang警告类型的列表,供参考。
你可以使用 CMAKE_CXX_COMPILER_ID
和 CMAKE_CXX_SIMULATE_ID
与你喜欢的编译器处理方式(if-else 或生成器表达式)一起使用。
-T ClangCL
的输出结果(Visual Studio 2019):
message(STATUS ${CMAKE_CXX_COMPILER_ID}) // Clang
message(STATUS ${CMAKE_CXX_SIMULATE_ID}) // MSVC
没有工具包的输出(Visual Studio 2019):
message(STATUS ${CMAKE_CXX_COMPILER_ID}) // MSVC
message(STATUS ${CMAKE_CXX_SIMULATE_ID}) // <empty>
CMAKE_CXX_SIMULATE_ID
未定义(为空)时会出现这种情况。第二个条件应该产生一个错误。只需使用 if (NOT (CMAKE_CXX_SIMULATE_ID STREQUAL "MSVC"))
即可。 - local-ninja