Answers:
更新:此答案早于现代CMake时代。每个理智的CMake用户都应避免摆弄,CMAKE_CXX_FLAGS
而应调用该target_compile_options
命令。检查mrts的答案,该答案提供了建议的最佳实践。
您可以执行以下操作:
if(MSVC)
# Force to always compile with W4
if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
else()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
endif()
elseif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
# Update if necessary
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-long-long -pedantic")
endif()
/Wall
如果您要遵循警告的“减法”策略(如clang的),则可以使用-Weverything
。无需选择要启用的警告,而是启用所有内容,然后选择要禁用的特定警告。
在现代CMake中,以下方法可以很好地工作:
if(MSVC)
target_compile_options(${TARGET_NAME} PRIVATE /W4 /WX)
else()
target_compile_options(${TARGET_NAME} PRIVATE -Wall -Wextra -pedantic -Werror)
endif()
我的同事建议了一个替代版本:
target_compile_options(${TARGET_NAME} PRIVATE
$<$<CXX_COMPILER_ID:MSVC>:/W4 /WX>
$<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-Wall -Wextra -pedantic -Werror>
)
替换${TARGET_NAME}
为实际的目标名称。-Werror
是可选的,它将所有警告变为错误。
或者,add_compile_options(...)
如果您想将其应用于@aldo在注释中建议的所有目标,请使用。
此外,一定要了解之间的差异PRIVATE
和PUBLIC
(公共选项将依赖于给定的目标对象继承)。
add_compile_options(...)
将其应用于所有目标。
else()
或中重复条件endif()
。
add_compile_options()
是,警告将传播到通过添加的目标add_subdirectory()
。如果以这种方式包括外部库,则该库的设计具有不同的警告级别,则可能会收到很多警告。
sugar_generate_warning_flags(
target_compile_options
target_properties
ENABLE conversion
TREAT_AS_ERRORS ALL
)
set_target_properties(
foo
PROPERTIES
${target_properties}
COMPILE_OPTIONS
"${target_compile_options}"
)
Xcode的结果:
CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION
Xcode属性(又名构建设置 -> 警告 -> 可疑的隐式转换 -> YES)-Werror
Makefile gcc和clang:
-Wconversion
,-Werror
视觉工作室:
/WX
,/w14244
这是到目前为止我发现的最佳解决方案(包括编译器检查):
if(CMAKE_BUILD_TOOL MATCHES "(msdev|devenv|nmake)")
add_definitions(/W2)
endif()
这将在Visual Studio中设置警告级别2。我想用-W2
它也可以在GCC中使用(未经测试)。
@Williams的更新:应该-Wall
用于GCC。
-W -Wall -Wextra -pedantic
。-Wextra
IIRC -W
在GCC的更高版本中进行了替换,但出于兼容性考虑,我将两者都保留了。
if (MSVC)
# warning level 4 and all warnings as errors
add_compile_options(/W4 /WX)
else()
# lots of warnings and all warnings as errors
add_compile_options(-Wall -Wextra -pedantic -Werror)
endif()
GCC和Clang共享这些标志,因此这应涵盖所有3个标志。
add_compile_options
在整个目录范围内,而target_compile_options
仅用于单个目标。
/Wall
标志(名为EnableAllWarnings
)。它产生的警告比还要多/W4
。但是根据我的经验,它会产生太多警告。