Qt部署文件在Wix安装包存在但7Z归档包缺失问题
CPack 7Z归档缺失动态生成文件的问题修复
问题概述
Qt应用通过CMake打包时,Wix安装包能正常包含部署脚本生成的deployed-files.true文件,但7Z等归档包中缺失该文件——尽管文件已在_CPack_Packages目录的对应文件夹中存在,安装目录下也能正常找到。
原因分析
当开启CPACK_ARCHIVE_COMPONENT_INSTALL时,CPack归档生成器(如7Z)仅会打包通过CMake install命令注册到对应组件的文件。你通过部署脚本动态生成的deployed-files.true未被添加到组件的文件列表中,因此即使它存在于临时打包目录,也不会被纳入最终归档。而Wix生成器的逻辑不同,它会扫描目标目录的所有文件,因此能包含该动态生成文件。
解决方案
修改部署脚本的install(CODE)逻辑,在生成deployed-files.true后,将其显式注册到对应组件,确保CPack归档生成器能识别并包含它。同时移除重复的预构建脚本,避免冗余操作。
修改后的完整CMake代码
cmake_minimum_required(VERSION 3.25) project(CMakePackageIssue VERSION 1.0.0 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) macro (installAnyQtDependencies componentName destinationDirectory) file(GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/qt-library-deploy.bat CONTENT "@echo off echo \"Qt Deploy called\" > \"%1\"\\deployed-files.true exit /b %errorlevel " ) install( CODE " message(DEBUG \"Running the package command.\") set(DEPLOY_FILE \"${CMAKE_INSTALL_PREFIX}/${destinationDirectory}/deployed-files.true\") execute_process( COMMAND \"${CMAKE_CURRENT_BINARY_DIR}/qt-library-deploy.bat\" \"${CMAKE_INSTALL_PREFIX}/${destinationDirectory}\" COMMAND_ERROR_IS_FATAL ANY ) # 将动态生成的文件注册到组件,确保CPack归档包含它 file(INSTALL DESTINATION \"${CMAKE_INSTALL_PREFIX}/${destinationDirectory}\" TYPE FILE FILES \"\${DEPLOY_FILE}\" COMPONENT ${componentName}) " COMPONENT ${componentName} ) endmacro() add_executable(CMakePackageIssue main.cpp) install(TARGETS CMakePackageIssue) installAnyQtDependencies(${PROJECT_NAME} ".") set(CPACK_ARCHIVE_COMPONENT_INSTALL ON) set(CPACK_VERBATIM_VARIABLES TRUE) option( PACKAGE_ONLY "A flag to enable only archive packaging." OFF ) if (PACKAGE_ONLY) set(CPACK_GENERATOR "7Z") else () set(CPACK_GENERATOR "WIX") endif () include(CPack)
修改说明
- 在
install(CODE)块中,执行部署脚本生成文件后,新增file(INSTALL)命令将deployed-files.true注册到指定组件,让CPack归档生成器将其纳入打包列表。 - 移除了原代码中
CPACK_PRE_BUILD_SCRIPTS相关的冗余逻辑,因为install阶段已经完成了文件生成和组件注册,无需重复执行部署脚本。
验证方法
设置PACKAGE_ONLY=ON后重新打包,生成的7Z归档解压后将包含deployed-files.true文件,与_CPack_Packages目录中的内容一致。
内容的提问来源于stack exchange,提问作者JadziaMD
相关产品推荐
相关产品推荐

