Qt构建Windows包的自动化脚本

Windows安装包种类:

1、MSI 一般用于驱动程序,安装时直接覆盖已有文件和程序
2、EXE 常用的安装程序,缺点是卸载时会有残留文件
3、APPX uwp应用推出时推出的一种安装包,只能用于windows8之后,之前的应用打包为此种格式比较复杂,不流行
4、MSIX 最新推出的格式支持windows所有平台(桌面、手机、平板),类似于苹果的安装包,需要签名,安全,做到干净卸载。windows 10后推出,且微软也提供了工具将上面四种安装包转换为MSIX格式安装包

虽然MSIX是windows推荐的安装包,也具有安全,无残留的有点,不过对于桌面端程序目前还是exe占主流。

Windows下exe安装包打包流程

  1. Power Shell环境配置
    执行如下命令更改Power Shell执行策略(否则无法运行脚本)
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
image.png

Windows的可执行文件引用的三方动态库(dll)描述只有相对路径一种方式(相对于可执行文件的路径),所以拷贝三方库后也就不需要MacOS中的步骤(4)了,而且exe安装包也不需要签名,Qt官方也给出了步骤(3)的工具windeployqt

构建脚本

将 install_win.iss 文件与脚本放置于同一个目录下,install_win.iss内容如下:

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

#define MyAppName "MytestApp"
#define MyAppVersion "1.5"
#define MyAppPublisher "My Company, Inc."
#define MyAppURL "https://www.example.com/"
#define MyAppExeName "MytestApp.exe"

[Setup]
; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{46760BD9-178F-48D7-9585-C27EE30A9573}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={autopf}\{#MyAppName}
DisableProgramGroupPage=yes
; Uncomment the following line to run in non administrative install mode (install for current user only.)
;PrivilegesRequired=lowest
OutputDir=.\Result\out
OutputBaseFilename=MytestAppInstaller
Compression=lzma
SolidCompression=yes
WizardStyle=modern

[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
Source: "C:\Users\zsz\CLionProjects\MytestApp\deploy\Result\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\zsz\CLionProjects\MytestApp\deploy\Result\out\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files

[Icons]
Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon

[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent

@echo off

setlocal

:Help
echo Usage: win_build.bat [options]
echo Options:
echo -h: show this help message
echo -t: build type, release or debug
echo -qt: qt path
echo -vcpkg: vcpkag path
echo -new: build version

REM 构建类型
set BUILD_TYPE=Release
REM 构建编译号
set BUILD_VERSION=1
REM Qt 安装路径
set QT_DIR=C:\Qt\5.15.2\msvc2019_64
REM vcpkg路径
set VCPKG_PATH=C:\Users\zsz\Developer\vcpkg
:Loop
if "%1"=="" goto EndLoop
if "%1"=="-t" set BUILD_TYPE=%2
if "%1"=="-qt" set QT_DIR=%2
if "%1"=="-vcpkg" set VCPKG_PATH=%2
if "%1"=="-new" set BUILD_VERSION=%2
if "%1"=="-h" goto Help

shift
goto Loop
:EndLoop

REM 获取当前目录
set CUR_DIR=%cd%
set PROJECT_NAME=MytestApp
REM cmake路径
set CMAKE_PATH=%QT_DIR%\..\..\Tools\CMake_64\bin\cmake.exe
REM ninja路径
set NINJA_PATH=%QT_DIR%\..\..\Tools\Ninja\ninja.exe
REM C/C++编译器路径;注意这里要用"/"而不是"\"
set CLANG_PATH=C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/Llvm/x64/bin/clang-cl.exe
REM vcvarsall.bat路径; 用于设置环境变量;
set VCVARSALL="C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat"
REM 编译目录
set BUILD_DIR=%CUR_DIR%\Result

REM 清理上一次构建
if exist %BUILD_DIR% rmdir /s /q %BUILD_DIR%
REM 创建生成目录
mkdir %BUILD_DIR%

REM 使用 CMake 生成项目文件
call %VCVARSALL% x86_x64
call %CMAKE_PATH%   -G Ninja ^
                   "-DCMAKE_BUILD_TYPE=%BUILD_TYPE%" ^
                   "-DCMAKE_PREFIX_PATH=%QT_DIR%" ^
                   "-DCMAKE_MAKE_PROGRAM=%NINJA_PATH%" ^
                   "-DCMAKE_TOOLCHAIN_FILE=%VCPKG_PATH%\scripts\buildsystems\vcpkg.cmake" ^
                   "-DCMAKE_C_COMPILER=%CLANG_PATH%" ^
                   "-DCMAKE_CXX_COMPILER=%CLANG_PATH%" ^
                   -DABS_CLOSE_LANGUAGE=0 ^
                   -S .. ^
                   "-B %BUILD_DIR%"

call %CMAKE_PATH% --build %BUILD_DIR% --target %PROJECT_NAME% -j 10

REM 安装目录
set INSTALL_DIR=%BUILD_DIR%\out
if exist %INSTALL_DIR% rmdir /s /q %INSTALL_DIR%
mkdir %INSTALL_DIR%

REM 使用 windeployqt 部署 Qt 依赖
call %QT_DIR%\bin\windeployqt --no-compiler-runtime --dir %INSTALL_DIR% %BUILD_DIR%\%PROJECT_NAME%.exe

set ISS_SCRIPT="install_win.iss"
set ISCC_PATH="C:\Program Files (x86)\Inno Setup 6\ISCC.exe"
call %ISCC_PATH% %ISS_SCRIPT%

echo Build complete!

endlocal
  • 最后构建目录如下:


    image.png

脚本下载地址:
https://gitee.com/nldxrz/ffmpeg-build-scripts/tree/master/qt

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容