CMake如何正确将PUBLIC_HEADER属性设置为多个头文件列表
问题根因
你遇到的问题是CMake列表展开逻辑导致的:RST_PUBLIC_HEADERS是存储了3个文件路径的CMake列表,底层以分号分隔不同值。在set_target_properties中直接使用${RST_PUBLIC_HEADERS}时,CMake会把列表拆分为3个独立参数,最终PUBLIC_HEADER属性只会被赋值为第一个参数rst.hpp,剩下的两个文件名会被识别为无效属性名直接忽略。
解决方案
只需给${RST_PUBLIC_HEADERS}套一层双引号,把整个列表作为单个值传递给PUBLIC_HEADER属性即可,修改后的配置代码如下:
set(RST_PUBLIC_HEADERS "rst.hpp" "CPrbs.hpp" "CRstController.hpp" ) set_target_properties( ${PROJECT_NAME} PROPERTIES VERSION ${PROJECT_VERSION} FRAMEWORK TRUE PUBLIC_HEADER "${RST_PUBLIC_HEADERS}" ) install(TARGETS ${PROJECT_NAME} LIBRARY DESTINATION lib PUBLIC_HEADER DESTINATION include/lib${PROJECT_NAME} )
修改后重新配置项目,get_target_property即可读取到完整的3个文件列表,安装时3个头文件都会被自动写入指定路径,无需额外使用install(FILES)单独处理。
扩展注意事项
该规则适用于所有CMake中接收列表类型值的属性配置场景:比如设置INTERFACE_SOURCES、INTERFACE_COMPILE_DEFINITIONS等属性时,如果传入的是列表变量,都需要用双引号包裹,避免参数拆分导致赋值异常。
内容的提问来源于stack exchange,提问作者dpeng
相关产品推荐
相关产品推荐

