如何在CMake中将属性传递给消费库?接口库配置问题排查
解决CMake接口库传递COMPILE_WARNING_AS_ERROR属性的问题
你的配置疏漏
- 误用非INTERFACE前缀属性:直接给INTERFACE库设置
COMPILE_WARNING_AS_ERROR属性无效,因为该属性是目标自身的编译属性,而INTERFACE库本身不参与编译,只有以INTERFACE_开头的属性才会被传递给依赖它的目标。 - 多余的COMPATIBLE_INTERFACE_BOOL设置:该属性用于处理多个依赖对同一布尔属性的兼容性冲突,并非用来传递属性,此处添加属于画蛇添足。
正确的属性传递方式
方式一:使用INTERFACE_COMPILE_WARNING_AS_ERROR属性
直接设置INTERFACE库的INTERFACE_COMPILE_WARNING_AS_ERROR属性,CMake会自动将该设置传递给依赖的目标:
# 设置接口库 add_library(options_lib INTERFACE) # 设置用于传递的INTERFACE前缀属性 set_target_properties(options_lib PROPERTIES INTERFACE_COMPILE_WARNING_AS_ERROR ON) # 消费库配置 add_library(my_actual_lib PUBLIC src/foo.cpp) target_link_libraries(my_actual_lib PUBLIC options_lib) # 验证属性是否生效 get_target_property(result my_actual_lib COMPILE_WARNING_AS_ERROR) message(STATUS "Result: ${result}")
执行后,get_target_property会返回ON,说明属性已成功传递。
方式二:直接添加编译器特定编译选项(兼容旧版CMake)
如果你的CMake版本较旧(低于3.12,INTERFACE_COMPILE_WARNING_AS_ERROR从3.12开始支持),可以直接通过target_compile_options添加对应编译器的警告转错误选项:
add_library(options_lib INTERFACE) # 根据编译器类型添加对应选项 if(MSVC) target_compile_options(options_lib INTERFACE /WX) else() target_compile_options(options_lib INTERFACE -Werror) endif() add_library(my_actual_lib PUBLIC src/foo.cpp) target_link_libraries(my_actual_lib PUBLIC options_lib)
这种方式兼容性更强,能覆盖更多编译器和CMake版本。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

