CMake 似乎在生成 Makefile 项目时附加了一些默认编译器标志-Wall,-Wextra例如 、 等。这些默认标志之一是-Wsign-conversion,我想将其从列表中删除。-Wno-sign-conversion像这样添加抑制标志
target_compile_options(myTarget PRIVATE "-Wno-sign-conversion")
Run Code Online (Sandbox Code Playgroud)
没有任何影响。执行此操作的“现代 CMake”方式是什么?
如果您不想查询编译器 ID/名称和/或版本(这很快就会变得一团糟),您可以使用CheckCCompilerFlag(或CheckCXXCompilerFlag)。这里的技巧是不检查警告禁用标志,而是检查警告本身。例如:
include(CheckCCompilerFlag)
check_c_compiler_flag(-Wsign-conversion HAVE_SIGN_CONVERSION)
if (HAVE_SIGN_CONVERSION)
target_compile_options(target_name PRIVATE -Wno-sign-conversion)
endif (HAVE_SIGN_CONVERSION)
Run Code Online (Sandbox Code Playgroud)
作为旁注,建议避免设置CMAKE_C_FLAGS和/或CMAKE_CXX_FLAGS直接设置。如果可能,请target_compile_options仅对需要执行此操作的目标禁用警告。如果您想全局禁用它,请使用add_compile_options.
请注意,如果构建脚本的其他部分直接设置这些标志,您仍然可能会收到警告(例如,如果有人这样做set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wsign-conversion"))。CMAKE_C_FLAGS这是您应该避免直接设置的原因之一CMAKE_CXX_FLAGS- 控制发生的事情变得极其困难。
添加选项的顺序也很重要。以下最小示例说明了一些事情(假设example.cpp包含将触发-Wsign-conversion警告的代码):
project(example)
add_executable(example example.cpp)
target_compile_options(example PRIVATE -Wsign-conversion)
target_compile_options(example PRIVATE -Wno-sign-conversion)
Run Code Online (Sandbox Code Playgroud)
这将抑制警告。编译器是这样调用的:/usr/bin/c++ -Wsign-conversion -Wno-sign-conversion
我们可以交换这两个target_compile_options调用:
project(example)
add_executable(example example.cpp)
target_compile_options(example PRIVATE -Wno-sign-conversion)
target_compile_options(example PRIVATE -Wsign-conversion)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,编译器将像这样调用:/usr/bin/c++ -Wno-sign-conversion -Wsign-conversion并触发警告。