一、簡述
Qt 項目開發完成之后,需要打包發布程序,而因為用戶電腦上沒有 Qt 配置環境,所以需要將 release 生成的 exe 文件和所依賴的 dll 文件復制到一個文件夾中,然后再用 Inno Setup 打包工具打包成一個 exe 安裝包,就可以發布了。
二、設置應用程序圖標
我們編譯好生成的 exe 文件的圖標是 Qt 自帶的一個白色的框框,不太好看,怎么能夠自己設置程序的圖標呢。先創建一個 ico 格式的文件,網上有很多在線就可以把 png 或 jpg 的圖片轉成 ico 格式的圖標文件,然后把 ico 文件放到源代碼目錄下,就是 .pro 文件的同一文件夾下。
在.pro項目文件中添加:
RC_ICONS = car.ico // 這里的car.ico是我的ico文件的名字,改成你自己的ico文件名
添加完后一定要重新 qmake 一遍,然后再運行一遍你的程序,這樣再看你的 debug 或者 release 文件夾下的 exe 文件就會有你設置好的圖標了。
三、發布程序
發布程序首先要獲得所依賴的 dll 文件,這里有兩種方法。方法一就是去 Qt 安裝目錄的 bin 目錄(筆者這里是F:\technology\Qt5.9.7\5.9.7\mingw53_32)中找所依賴的 dll 文件。方法二就是使用 Qt 自帶的發布程序工具 windeployqt.exe,可以生成所依賴的 dll 文件。這里着重講解第二種方法,步驟如下:
(1)以 Release 方式編譯生成 exe 程序,也就是調試運行的方式選擇 Release。
運行成功后,如果勾選了 “shadow build” 將源碼路徑和構建路徑分開,那么將在 build-cleanRobot-Desktop_Qt_5_9_7_MinGW_32bit-Release 文件夾下生成 exe 文件,如下圖1所示; 否則在源碼工程目錄下的 release 文件夾下生成 exe 文件,如下圖2所示。
將 cleanRobot.exe 可執行文件復制到別的文件夾下,這里我復制到 F:\cleanRobot 下,然后在 “開始菜單Qt5.9.7” 下找到 “Qt 5.9.7 for Desktop cmd” 運行文件,打開運行。
執行 cd F:\cleanRobot
命令進入exe 文件所在目錄下, 再執行 dir
命令查看目錄,最后執行 windeployqt cleanRobot.exe
命令,Qt 就會自動把該程序所需要的所有 dll 拷貝過來。
當然有可能有些 dll 不是我們需要的,例如下面的 D3Dcompiler_47.dll,為了使發布程序盡可能的小,可以把這些 dll 一個一個刪掉,再打開 exe 程序,看哪些 dll 是刪掉后就打開不了程序的,保留下來,剩下的刪除即可。
再將自帶文件夾,例如下圖的 image 文件夾復制過來,刪掉不必要的 dll,之后的 exe 安裝包文件夾如下圖所示。
其實到這一步,就可以將整個文件夾發布出去了,但如果想打包成一個 exe 安裝包,就要進行下面的步驟了。
四、打包程序
Inno Setup 是一個免費的 Windows 安裝程序制作軟件,小巧、簡便、精美是其最大特點,支持 pascal 腳本,能快速制作出標准 Windows2000 風格的安裝界面,足以完成一般安裝任務。 |
官方下載地址:http://www.jrsoftware.org/isdl.php#stable
下載后直接安裝即可。
項目開發完成之后,需要打包程序發行,可以使用 Inno Setup 軟件制作安裝 exe。以下詳細講解如何打包應用程序:
(1)打開 Inno Setup Complier,點擊 【file】→【new】,新建一個腳本向導程序,然后點擊【next】;
(2)在應用程序信息中輸入 “應用程序名稱”、“應用程序版本”、“應用程序發布者”、“應用程序網站”,這些信息會自動在腳本中生成,然后點擊下一步;
(3)自定義打包文件的的輸出地址以及輸出文件夾的名稱,然后點擊下一步;
(4)選擇應用程序的主執行文件,也就是你編譯生成的 exe 文件,下面點擊 “Add folder ”,把所有你的程序運行需要的 dll 和資源以及配置文件放在一個文件夾里,選擇這個文件夾,然后點擊下一步;
注:Add folder 添加 .exe 的父文件夾,將依賴的 dll 等文件全部包含在內。
(5)輸入應用程序在開始菜單中顯示的名字,需要哪些功能,在前邊打上對勾,一般默認即可,然后點擊下一步;
(6)這里可以選擇 “許可文件”,“安裝前的文件”(如 Readme 文件等),“安裝后顯示信息” 等,然后點擊下一步;
(7)選擇 “安裝語言”,然后點擊下一步;
(8)選擇 “自定義編譯器輸出文件夾”、“編譯器輸出基本文件名”、“自定義的安裝程序圖標文件”及“安裝密碼”,然后點擊下一步;
注:第一個選項表示的是生成的 安裝包*.exe 的輸出目錄。icon文件是 安裝包*.exe 的圖標文件。
(9)在這里選擇是否使用 #define 編譯指令,選擇 yes 也就是在生成的腳本里使用 #define 宏定義一些常量,方便腳本編寫,勾不勾選隨意,然后點擊下一步;
前面最后一步中間會詢問你是否立即編譯新的腳本,這個腳本是根據剛才我們前面填寫的那些內容自動生成的。可以直接使用編譯,也可以自己重新編寫,下面貼出生成的腳本代碼。
; Script generated by the Inno Setup Script Wizard. ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
#define MyAppName "紅牌檢測系統"
#define MyAppVersion "2.5"
#define MyAppPublisher "SHIOTC, Inc."
#define MyAppURL "http://www.shiotc.com/"
#define MyAppExeName "redplate_qt.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={{D21B4F6B-401E-4575-B6E1-612A9CA50D58} AppName={#MyAppName} AppVersion={#MyAppVersion} ;AppVerName={#MyAppName} {#MyAppVersion} AppPublisher={#MyAppPublisher} AppPublisherURL={#MyAppURL} AppSupportURL={#MyAppURL} AppUpdatesURL={#MyAppURL} DefaultDirName=D:/redplate_detection_v2.5 DefaultGroupName=redplate_detection_v2.5 OutputDir=E:\carriage_recognition\redplate_detection\qt\redplate_qt_svm2\x64\Release OutputBaseFilename=redplate_detection_2.5 ;SetupIconFile=E:\carriage_recognition\redplate_detection\qt\redplate_qt_svm2\x64\Release\ICON.ico Password=123456 Compression=lzma SolidCompression=yes [Languages] Name: "english"; MessagesFile: "compiler:Default.isl" [Tasks] Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked [Files] Source: "E:\carriage_recognition\redplate_detection\qt\redplate_qt_svm2\x64\Release\redplate_qt.exe"; DestDir: "{app}"; Flags: ignoreversion Source: "E:\carriage_recognition\redplate_detection\qt\redplate_qt_svm2\x64\Release\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs ; NOTE: Don't use "Flags: ignoreversion" on any shared system files
[Icons] Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon [Run] Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent
- 運行過程中出現錯誤,可以直接在腳本中進行修改。
- 如果要打包出新版本的 exe 安裝包文件,不需要再將上面流程走一遍,只需要將原先的 exe 可執行文件替換掉,再打開原先生成的腳本文件運行,即可生成新版本的 exe 安裝包文件。
最后就生成了 exe 安裝包文件,點擊打開exe文件即可進行安裝。