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
相关产品推荐
相关产品推荐

