Zephyr RTOS 3.2.99如何启用C++异常以移除-fno-exceptions编译选项
Zephyr 3.2.99 启用C++异常的配置修正
问题根源
Zephyr构建系统会根据默认配置自动注入-fno-exceptions编译选项,仅通过target_compile_options添加-fexceptions会被后续的默认配置覆盖,导致异常功能无法正常启用。
解决步骤
1. 确认prj.conf配置有效性
确保prj.conf中已正确启用以下两项配置:
CONFIG_CPLUSPLUS=y CONFIG_EXCEPTIONS=y
注:Zephyr 3.x版本中
CONFIG_EXCEPTIONS依赖CONFIG_CPLUSPLUS,必须同时开启才能生效。
2. 在CMakeLists.txt中强制覆盖编译选项
不要直接添加-fexceptions,而是先移除默认的-fno-exceptions再添加目标选项,避免被覆盖:
# 移除默认的-fno-exceptions target_compile_options(app PRIVATE REMOVE -fno-exceptions) # 添加启用异常的编译选项 target_compile_options(app PRIVATE -fexceptions)
若需要全局生效,也可以直接修改CMAKE_CXX_FLAGS:
string(REPLACE "-fno-exceptions" "-fexceptions" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
3. 检查板级/SOC配置的强制覆盖
部分板级或SOC的配置文件可能会强制设置-fno-exceptions,可以检查以下路径的文件:
<ZEPHYR_BASE>/boards/<架构>/<目标板>/board.cmake<ZEPHYR_BASE>/soc/<架构>/<目标SOC>/soc.cmake
若发现相关强制设置,可注释该语句或在项目CMakeLists.txt中用更高优先级的配置覆盖。
4. 验证编译参数
编译时添加VERBOSE=1参数,查看实际传递给编译器的选项,确认-fno-exceptions已被移除:
west build -b <你的目标板> -t build VERBOSE=1
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

