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

Ubuntu16.04引入gtkmm/box.h时C++17编译报错问题求助

问题根因

Ubuntu 16.04官方源提供的glibmm 2.4版本为2.46.x,该版本发布早于C17标准定稿,头文件中仍使用已被C17废弃的动态异常规范(throw(xxx)语法)。你使用C++17标准编译项目时,编译器会将该语法识别为错误。
Ubuntu 20.04、MacOS环境下的glibmm版本更高,官方已清理了废弃的动态异常声明,因此可以正常编译。你编写的简单窗口应用未触发到glibmm的variant相关头文件逻辑,所以没有报错,和gtkmm/box.h本身无关。

可行解决方案

按改造成本从低到高排序:

  • 方案1:仅为Ubuntu 16.04环境新增编译参数忽略报错
    在你的CMakeLists.txt中添加条件判断,仅在Ubuntu 16.04环境下添加编译选项屏蔽该错误,不影响其他环境的编译配置:
    if(CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
        execute_process(COMMAND lsb_release -rs OUTPUT_VARIABLE UBUNTU_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE)
        if(UBUNTU_VERSION VERSION_EQUAL "16.04")
            add_compile_options(-Wno-deprecated-dynamic-exception-spec)
        endif()
    endif()
    
    如果添加后仍报错,可以在上述编译选项后额外添加-fpermissive临时兼容语法校验。
  • 方案2:项目降级使用C14标准编译
    动态异常规范在C
    14标准中仍属于合法语法,如果你的项目代码没有依赖C17独有的特性,可以直接修改CMakeLists.txt中的C标准配置:
    set(CMAKE_CXX_STANDARD 14)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    
    该方案无需额外兼容配置,跨环境稳定性更高。
  • 方案3:Ubuntu 16.04环境升级glibmm版本
    可以通过第三方PPA源安装更高版本的glibmm、gtkmm套件,替换官方源的旧版本,从根本上解决头文件语法兼容问题,操作前注意备份环境避免依赖冲突。

内容的提问来源于stack exchange,提问作者João Lucas Gouveia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 15:15:03