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

NDK v26.2中启用异常与RTTI的编译问题求助

解决NDK v26.2中-fexceptions被-fno-exceptions覆盖的问题

问题根源

NDK v26.2的CMake工具链会在编译流程的后续阶段自动追加-fno-exceptions和-fno-rtti选项,如果你只是简单地在配置里追加-fexceptions,会因为编译选项的优先级规则(后出现的选项覆盖先出现的)导致设置失效。

有效解决方案

方案1:移除默认选项后再添加目标选项

在CMakeLists.txt中,先用字符串替换移除默认的-fno-exceptions,再添加-fexceptions,确保最终生效的是启用异常的选项:

# 清除默认的-fno-exceptions
string(REPLACE "-fno-exceptions" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
# 添加-fexceptions
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexceptions")

# 如果需要启用RTTI,用同样方式处理
string(REPLACE "-fno-rtti" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -frtti")

方案2:使用CMake原生属性控制异常

CMake提供了专门的编译特性属性来启用异常,这种方式会让工具链自动处理选项顺序,避免冲突:

# 启用C++异常
set(CMAKE_CXX_COMPILE_FEATURES "${CMAKE_CXX_COMPILE_FEATURES} cxx_exceptions")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexceptions")

# 启用RTTI(如果业务需要)
set(CMAKE_CXX_COMPILE_FEATURES "${CMAKE_CXX_COMPILE_FEATURES} cxx_rtti")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -frtti")

方案3:在build.gradle中直接覆盖cppFlags

如果习惯用Gradle配置,不要用addAll追加选项,而是直接覆盖整个cppFlags,确保-fexceptions成为最终生效的选项:

android {
    externalNativeBuild {
        cmake {
            // 直接设置cppFlags,替换默认配置
            cppFlags "-fexceptions -frtti"
            // 按需指定架构
            abiFilters 'armeabi-v7a', 'arm64-v8a'
        }
    }
}

注意:这种方式会替换默认的cppFlags,若有其他需要保留的编译选项,要一并写入。

验证方式

构建时查看Android Studio Build窗口中的编译命令行,确认-fno-exceptions已被移除,或者-fexceptions出现在-fno-exceptions之后。

内容的提问来源于stack exchange,提问作者AchillesHeart

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 05:37:35