CMake-CPack打包子项目版本不一致问题求助
解决CMake子项目版本传递到顶层CPACK的问题
步骤1:子项目向外暴露版本变量
在primary_display、secondary_display这类有独立版本的子项目CMakeLists.txt中,定义版本后把变量传递到父作用域:
# primary_display/CMakeLists.txt project(primary_display VERSION 1.0.0) # 将子项目版本传递给顶层项目 set(PRIMARY_DISPLAY_VERSION ${PROJECT_VERSION} PARENT_SCOPE)
# secondary_display/CMakeLists.txt project(secondary_display VERSION 1.0.0) set(SECONDARY_DISPLAY_VERSION ${PROJECT_VERSION} PARENT_SCOPE)
步骤2:顶层CPACK绑定组件与子项目版本
在顶层CMakeLists.txt的CPACK配置段,为每个组件单独指定对应版本:
# 顶层CMakeLists.txt的CPACK配置区 set(CPACK_COMPONENTS_ALL desktop primary_display secondary_display) set(CPACK_GENERATOR "DEB") set(CPACK_DEB_COMPONENT_INSTALL ON) # 根项目版本作为默认,按需赋值给对应组件 set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION}) # 为每个子项目组件绑定专属版本 set(CPACK_DEBIAN_PRIMARY_DISPLAY_PACKAGE_VERSION ${PRIMARY_DISPLAY_VERSION}) set(CPACK_DEBIAN_SECONDARY_DISPLAY_PACKAGE_VERSION ${SECONDARY_DISPLAY_VERSION}) # desktop组件如果用根项目版本,可省略单独设置,或手动指定 # set(CPACK_DEBIAN_DESKTOP_PACKAGE_VERSION ${PROJECT_VERSION})
注意事项
- 必须先通过
add_subdirectory引入子项目,再配置CPACK的组件版本变量,确保顶层能拿到子项目传递的版本值。 - 执行
cmake .. && make package后,检查生成的Deb包文件名,比如primary_display_1.0.0_amd64.deb,确认版本是否正确对应。
内容的提问来源于stack exchange,提问作者a.wise
相关产品推荐
相关产品推荐

