如何在不修改库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
相关产品推荐
相关产品推荐

