如何在CMake中无需编译安装Framework目标的头文件?
解决Framework目标下无需编译即可安装头文件的问题
当目标是Framework时,仅通过install(FILES)复制头文件会缺少Foo.framework/Versions/Current/Headers和Foo.framework/Headers这两个关键符号链接——这两个链接是CMake通过install(TARGETS)安装Framework时自动生成的,但如果不想编译库,就需要手动添加创建链接的步骤。
完整CMake配置示例
project(Foo) add_library(Foo foo.cpp foo.h) set_target_properties(Foo PROPERTIES FRAMEWORK TRUE PUBLIC_HEADER "foo.h") # 1. 安装头文件到Framework的Versions/A/Headers目录 install(FILES foo.h DESTINATION Foo.framework/Versions/A/Headers COMPONENT headers) # 2. 创建Versions/Current/Headers符号链接,指向A/Headers install(CODE "execute_process( COMMAND ${CMAKE_COMMAND} -E remove -f \${CMAKE_INSTALL_PREFIX}/Foo.framework/Versions/Current/Headers COMMAND ${CMAKE_COMMAND} -E create_symlink A/Headers \${CMAKE_INSTALL_PREFIX}/Foo.framework/Versions/Current/Headers )" COMPONENT headers) # 3. 创建顶层Foo.framework/Headers符号链接,指向Versions/Current/Headers install(CODE "execute_process( COMMAND ${CMAKE_COMMAND} -E remove -f \${CMAKE_INSTALL_PREFIX}/Foo.framework/Headers COMMAND ${CMAKE_COMMAND} -E create_symlink Versions/Current/Headers \${CMAKE_INSTALL_PREFIX}/Foo.framework/Headers )" COMPONENT headers) # 自定义installheaders目标,仅安装headers组件 add_custom_target(installheaders COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=headers -P "${CMAKE_BINARY_DIR}/cmake_install.cmake" )
关键说明
- 所有安装步骤都指定了
COMPONENT headers,确保仅在执行installheaders目标时触发,不会强制编译库文件。 - 使用
CMAKE_COMMAND -E create_symlink创建符号链接,同时先执行remove -f避免已存在链接导致的错误。 - 执行
make installheaders(或对应生成器命令如ninja installheaders)即可完成头文件和符号链接的安装,无需编译Framework库。
内容的提问来源于stack exchange,提问作者user3667089
相关产品推荐
相关产品推荐

