You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

原因分析

  1. CMAKE_WARN_DEPRECATED的作用范围不匹配
    CMAKE_WARN_DEPRECATED仅控制CMake自身的废弃功能警告(比如旧版CMake命令、变量的使用提示),完全不涉及编译器层面的C++旧头文件警告,因此设置它为OFF对该警告无效。

  2. 命令行传-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 06:06:05