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

如何在不修改库CMake源码的情况下取消继承-fno-rtti编译选项

在可执行程序端移除库传递的-fno-rtti编译选项

方案1:直接用反向选项覆盖

编译器会以最后生效的选项为准,所以可以直接给可执行目标添加-frtti选项,直接抵消-fno-rtti的效果,这是最简单的方式:

add_executable(MyExe main.cpp)
target_link_libraries(MyExe PRIVATE MyLib)
# 添加-frtti,覆盖库传递的-fno-rtti
target_compile_options(MyExe PRIVATE "-frtti")

方案2:精准移除目标中的-fno-rtti选项

如果需要彻底移除该选项而非覆盖,可以获取可执行目标的编译选项集合,移除指定选项后重新设置:

add_executable(MyExe main.cpp)
target_link_libraries(MyExe PRIVATE MyLib)

# 获取可执行目标的编译选项(包含库传递过来的)
get_target_property(exe_compile_opts MyExe COMPILE_OPTIONS)
if(exe_compile_opts)
    list(REMOVE_ITEM exe_compile_opts "-fno-rtti")
    set_property(TARGET MyExe PROPERTY COMPILE_OPTIONS ${exe_compile_opts})
endif()

# 若可执行目标本身需要导出接口,同步处理INTERFACE_COMPILE_OPTIONS
get_target_property(exe_interface_opts MyExe INTERFACE_COMPILE_OPTIONS)
if(exe_interface_opts)
    list(REMOVE_ITEM exe_interface_opts "-fno-rtti")
    set_property(TARGET MyExe PROPERTY INTERFACE_COMPILE_OPTIONS ${exe_interface_opts})
endif()

方案3:全局覆盖(不推荐)

如果项目所有目标都需要启用RTTI,可以通过全局变量设置,但这种方式会影响所有编译目标,容易引发意外:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -frtti")

为什么不推荐修改库目标的方案?

你之前修改库INTERFACE_COMPILE_OPTIONS的方式会改变库的原始配置,可能影响其他依赖该库的目标。上述可执行端的方案仅针对当前可执行程序生效,不会破坏库本身的属性,更符合依赖隔离的要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 03:22:48