You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

修改说明

  1. 在install(CODE)块中,执行部署脚本生成文件后,新增file(INSTALL)命令将deployed-files.true注册到指定组件,让CPack归档生成器将其纳入打包列表。
  2. 移除了原代码中CPACK_PRE_BUILD_SCRIPTS相关的冗余逻辑,因为install阶段已经完成了文件生成和组件注册,无需重复执行部署脚本。

验证方法

设置PACKAGE_ONLY=ON后重新打包,生成的7Z归档解压后将包含deployed-files.true文件,与_CPack_Packages目录中的内容一致。

内容的提问来源于stack exchange,提问作者JadziaMD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 05:12:06