如何用CMake生成并安装Proj项目的运行时依赖?
解决方案
1. 修正自定义命令的输出路径
首先把生成的bin文件指定到二进制构建目录,避免CMake在配置阶段检查源目录是否存在这些文件,同时确保命令能正确读取源目录的extra.json:
project(Proj) add_library(Proj SHARED main.cpp) # 把生成的bin文件路径指向构建目录 set(EXTRA_FILES ${CMAKE_CURRENT_BINARY_DIR}/extra1.bin ${CMAKE_CURRENT_BINARY_DIR}/extra2.bin ) add_custom_command( OUTPUT ${EXTRA_FILES} # 切换到源目录执行生成命令(适配generate-extra-files读取当前目录下的extra.json) COMMAND ${CMAKE_COMMAND} -E chdir ${CMAKE_CURRENT_SOURCE_DIR} generate-extra-files extra.json # 将生成的文件复制到构建目录(如果generate-extra-files默认输出到源目录) COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/extra1.bin ${CMAKE_CURRENT_BINARY_DIR}/ COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/extra2.bin ${CMAKE_CURRENT_BINARY_DIR}/ DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/extra.json VERBATIM )
如果
generate-extra-files支持指定输出目录,直接用下面的命令更简洁,省去复制步骤:COMMAND generate-extra-files ${CMAKE_CURRENT_SOURCE_DIR}/extra.json --output-dir ${CMAKE_CURRENT_BINARY_DIR}
2. 关联生成目标与库
创建一个仅依赖生成文件的自定义目标,再让Proj库依赖这个目标,确保构建库前先生成bin文件:
# 创建自定义目标,仅当依赖(extra.json)变化时才重建 add_custom_target(GenerateExtraFiles DEPENDS ${EXTRA_FILES} ) # 让Proj库关联生成目标,保证构建顺序 add_dependencies(Proj GenerateExtraFiles)
3. 安装bin文件到库的同一目录
通过$<TARGET_FILE_DIR:Proj>自动获取库的安装路径(适配Windows/Unix的目录差异),把bin文件安装到该路径:
install(TARGETS Proj COMPONENT main_component) # 将生成的bin文件安装到与Proj库相同的目录 install(FILES ${EXTRA_FILES} DESTINATION $<TARGET_FILE_DIR:Proj> COMPONENT main_component )
之前方法的问题分析
- 方案1问题:直接把bin文件作为库的依赖时,若路径指向源目录,CMake配置阶段会检查文件是否存在导致报错;且未正确关联自定义命令的依赖链,
extra.json变更时不会触发重建。 - 方案2问题:如果用
add_custom_target(ExtraTarget ALL ${EXTRA_FILES}),ALL参数会让目标每次构建都执行,而非仅在依赖变化时重建。 - 方案3不适用:
install(IMPORTED_RUNTIME_ARTIFACTS)用于安装导入目标的运行时文件,你的场景是生成自定义文件,完全不匹配。
内容的提问来源于stack exchange,提问作者thomasa88
相关产品推荐
相关产品推荐

