CMAKE_WARN_DEPRECATED无法禁用GCC12弃用警告问题咨询
为何CMAKE_WARN_DEPRECATED和直接传-Wno-deprecated无法屏蔽GCC12的C++旧头文件警告?
问题复现
执行的CMake配置命令:
cmake . -G Ninja -D CMAKE_PREFIX_PATH=~/libs/QT6.5d -DCMAKE_WARN_DEPRECATED=OFF
使用GCC12构建时仍出现如下警告:
/usr/include/c++/12/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header which may be removed without further notice at a future date. Please use a non-deprecated interface with equivalent functionality instead. For a listing of replacement headers and interfaces, consult the file backward_warning.h. To disable this warning use -Wno-deprecated. [-Wcpp] 32 | #warning \ | ^~~~~~~
同时尝试以下命令也无法解决问题:
cmake . -G Ninja -D CMAKE_PREFIX_PATH=~/libs/QT6.5d -Wno-deprecated
原因分析
CMAKE_WARN_DEPRECATED的作用范围不匹配
CMAKE_WARN_DEPRECATED仅控制CMake自身的废弃功能警告(比如旧版CMake命令、变量的使用提示),完全不涉及编译器层面的C++旧头文件警告,因此设置它为OFF对该警告无效。命令行传-Wno-deprecated的方式错误
CMake命令行的-W参数是用于控制CMake自身警告的选项(例如-Wdev、-Wno-dev),并非传递给编译器的编译参数。直接写-Wno-deprecated会被CMake当作自身参数处理,根本不会传递给GCC,所以编译器仍会输出警告。
解决方案
要让GCC收到屏蔽该警告的编译选项,需通过CMake的编译选项变量传递:
方法1:命令行通过CMAKE_CXX_FLAGS传递
cmake . -G Ninja -D CMAKE_PREFIX_PATH=~/libs/QT6.5d -DCMAKE_CXX_FLAGS="-Wno-deprecated -Wno-cpp"
注:同时添加-Wno-cpp是因为GCC将#warning指令产生的警告归为-Wcpp类别,仅用-Wno-deprecated可能无法完全屏蔽该警告。
方法2:在CMakeLists.txt中添加目标级编译选项
若不想每次命令行输入,可在项目的CMakeLists.txt中针对目标设置:
# 替换为你的实际目标名称 if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "12") target_compile_options(your_target_name PRIVATE -Wno-deprecated -Wno-cpp) endif()
如果需要全局生效,也可以用add_compile_options(-Wno-deprecated -Wno-cpp),但更推荐按目标粒度设置以避免影响无关代码。
内容的提问来源于stack exchange,提问作者Alexey Starinsky
相关产品推荐
相关产品推荐

