目錄
1.簡介
在對Qt應用程序的打包發佈的時候,經過多方查閱資料和自身實踐,本文將總結Qt程序在不同操作系統下的打包發佈問題
2.windows下的打包
1)發佈環境
- win10專業版
- QT5.11
- Qt Creator4.7.1
- MinGw5.3.0 32bit
2)方法一 – release版本發佈
通過這個方式發佈的Qt應用程序將會把可執行應用程序.exe
和它所依賴的動態鏈接庫一同拉取到一個文件夾中,將此文件夾拷貝到客戶機上(無Qt開發環境也可)打開可執行應用程序即可運行。不過這樣發佈的缺點就是發佈文件太大了。
a) release要發佈程序
首先需要在Qt Creator下,通過release方式運行想要發佈的程序
之後,在項目的存放目錄下,找到release版本的影子文件夾
進入文件夾之後發佈程序的.exe
可執行文件,將其拷貝到一個好找的地方如桌面,以我這裏爲例,將其拷貝到桌面新建的一個叫Chat
的文件夾
如果這個時候雙擊打開的話,就會提示缺少一系列的動態鏈接庫,如果一個個的補全這些庫的話,很麻煩也懶得找。所以需要將其打包
b) 通過windeployqt
打包
如果使用的是MinGw的編譯環境,那麼,我們就會在應用程序裏面找到一個叫Qt5.11.2 for Desktop
的命令行工具
將其雙擊打開進入桌面那個存放可執行文件的Chat
文件夾,使用Qt自帶的打包工具windeployqt
命令打包動態鏈接庫到此文件夾
打包成功後,就會發現之前在桌面創建的那個文件夾裏面自動包含了程序需要的動態鏈接庫和環境配置等
這時候在此文件夾中可以雙擊打開這個應用並且成功打開,就可以將整個文件夾打包發給沒有開發環境的客戶機了
3)方法二 – 發佈成獨立的可執行exe文件
前面我們提到過,通過Qt自帶的windeployqt方式發佈的程序,文件包很大,一班都有好幾十兆,不利於遷移,所以我們還可以利用其他打包工具,將動態鏈接庫集成一下
a) 下載工具
這裏我們用到的工具叫 Enigma Virtual Box,這是一個集成式的打包軟件,軟件本身並沒有多大,只有幾兆大小,但麻雀雖小五臟俱全,該有的發佈功能都有,並且操作見到,到官網下載
b) 打包
需要注意的是,這第二種打包方式是建立在第一種打包方式通過windeployqt
的打包方式之上的,需要第一步的打包文件夾。所以第一種打包方式是基礎
人們常說no picture say jb
,所以下面是詳細圖片的記錄,打開Enigma Virtual Box軟件操作如下
設置完成之後,運行如下
這時候在新的文件夾中就會發現只有一個打包好的獨立可執行文件,雙擊就可打開
使用這種方式打包的應用程序比前者小了很多,並且是獨立的可執行文件,可以直接打開,方便了許多
4)方法三 – 打包成安裝包發佈
如果是想打包成桌面軟件安裝包的形式那種,也是需要打包工具來實現,因爲博主暫時沒有這方面的需求,但是也給出兩種解決方式
a)通過Inno Setup工具打包
Inno Setup
是一種專門應用於應用程序安裝包打包的工具,可以自行定義發佈者的信息和版本信息等,具體方式可參考此篇博文,站在巨人的肩上
b)通過Advanced Installer工具打包
Advanced Installer
也是一種強大的打包工具,發佈定義方式衆多,具體可參考這篇博文
3.Linux下的打包發佈
1)發佈環境
- deepin15.11
- Qt 5.10.1
- Gcc 64bit
2)方法一 – 通過腳本打包
a)release編譯可執行文件
在Linux中使用Qt以release的方式編譯運行,然後將得到的可執行文件拷貝到一個新的地方,比如博主這裏在桌面新建的一個叫pic
的文件夾
b)編寫腳本文件
使用命令進入可執行文件的目錄下,然後新建兩個shell腳本
-
pack.sh
: 用於拷貝程序連接的動態庫到要打包的文件夾中。命令編寫如下-
#!/bin/sh exe="picClient" #需要發佈的程序名稱 pwd="/home/ohuohuoo/Desktop/picClient" #創建文件夾的位置 files=$(ldd $exe | awk '{if (match($3,"/")){ printf("%s "),$3 } }') cp $files $pwd
-
-
picClient.sh
: 此腳本名必須和要打包發佈的程序名字相同,我這裏發佈的名字爲picClient
,所以命名爲picClient.sh
。命令內容編寫如下,不需要改動-
#!/bin/sh appname=`basename $0 | sed s,\.sh$,,` dirname=`dirname $0` tmp="${dirname#?}" if [ "${dirname%$tmp}" != "/" ]; then dirname=$PWD/$dirname fi LD_LIBRARY_PATH=$dirname export LD_LIBRARY_PATH $dirname/$appname "$@"
-
c)執行腳本
- 需要注意的是,最後讓程序運行的是腳本,所以我們直接運行
picClient.sh
這個腳本讓的程序運行成功
d)解決xcb問題
使用上述的步驟打包的文件夾,將其壓縮成解壓包拷貝到目標用戶機上運行,如果對方安裝有Qt開發環境,那麼就可以成功運行,但是如果對方沒有,而且還是Ubuntu的操作系統的話,就會提示無法加載xcb插件
的問題,一般這種問題就是缺少了兩個動態庫的依賴環境
- libQt5XcbQpa.so.5
- libQt5Dbus.so.5
這是兩個鏈接,需要使用命令來查看Qt不同版本對應的這兩個文件的實體文件(直接拷貝鏈接文件無效),進入Qt安裝環境中下的lib
庫,一般是/Qt5.xx.x/xx.x/gcc_xx/lib
這路徑,進入後找到並複製到打包文件夾中
然後將找到的兩個依賴庫重命名爲鏈接文件,方便腳本查找
然後再執行運行腳本,就不會出現xcb
的報錯問題,打包文件到此就可以拷貝到任意Linux客戶機上成功運行了(😄)。
3)方法二 – 通過Linuxdeployqt部署打包
a)下載linuxdeployqt
windows下有Qt自帶的打包工具windeployqt
,而Linux下這樣也有這樣的部署工具,只不過這不是自帶的,他在開源的GitHub上有編譯好的程序文件,只需要進行調用即可linuxdeployqt下載
將其下載下來之後,賦予其可執行程序的權限,然後移動至/usr/local/bin/
目錄,通過重命名爲linuxdeployqt,完成之後,可以輸入linuxdeployqt -version
查看版本信息,如果輸出版本信息,則表示安裝成功
b)配置Qt版本環境變量
打開終端,然後輸入vim ~/.bashrc
命令,然後在文件末尾追加以下關於Qt環境的內容,主要需要替換爲自己的Qt安裝路徑
#添加Qt環境 -- 需要換成自己的Qt安裝路徑
export PATH=/home/ohuohuoo/Qt5.10.1/5.10.1/gcc_64/bin:$PATH
export LD_LIBRARY_PATH=/home/ohuohuoo/Qt5.10.1/5.10.1/gcc_64/lib:$LD_LIBRARY_PATH
export QT_PLUGIN_PATH=/home/ohuohuoo/Qt5.10.1/5.10.1/gcc_64/plugins:$QT_PLUGIN_PATH
export QML2_IMPORT_PATH=/home/ohuohuoo/Qt5.10.1/5.10.1/gcc_64/qml:$QML2_IMPORT_PATH
然後執行source ~/.bashrc
命令,使得修改命令在不重啓的情況下立刻生效
c)打包部署
和之前一樣,也是在桌面新建一個目錄用於打包,並將通過release運行的要發佈的可執行文件拷貝進去
這裏提示我的系統太新了(deepin 15.11😄),讓我選擇箇舊一點的系統使用linuxdeployqt
,查閱文檔之後發現,這版本的linuxdeployqt
只支持Ubuntu16.04和openSUSE 15.0以下Linux系統
所以我這裏換成了Ubuntu14.1並換了個linuxdeployqt
版本()同樣執行到這一步,顯示報錯,提示沒有加載Icon文件
因此需要刪除默認生成的圖標文件default.png
,並重新爲此提供一個,以logo.png
爲例,然後再將目錄文件下生成的default.desktop
文件重命名爲picClient.desktop
(需要和要打包的可執行文件名稱一致),修改內容如下
[Desktop Entry]
Version=1.0 # 版本
Type=Application # 類型
Name=picClient # app名
Exec=picClient # app執行路徑
Icon=logo.png # 圖標
Comment=This is a simple program # 說明信息
Terminal=false # 是否在終端啓動
Categories=Development;
完成之後,重新執行linuxdeployqt picClient -appimage
命令,提示無誤後,將會生成一個以.AppImage
結尾的文件
成功之後,爲其賦予權限,運行即可成功顯示效果
chmod +x MyApp-x86_64.AppImage
./MyApp-x86_64.AppImage
注意:通過linuxdeployqt方式打包的應用程序,不支持從Qt4到Qt5的源碼遷移,因爲編譯環境不同,先前也是準備直接將我在deepin中的想要發佈的程序源碼拷貝到我的uUbuntu14中去重新利用Qt來編譯之後再使用linuxdeployqt
打包,發現始終無法解決cannot execute binary file
的問題,後來發現是我Qt版本的原因,一個是Qt4一個是Qt5,所以只能在Ubuntu中重新編寫了個簡單demo用於發佈演示。
通過這種方式打包的文件,由於linuxdeployqt
的綠色開源性,所以支持在不同的Linux發行版上運行,很方便,各位也可以嘗試下(😄😄)
4.結尾
這篇博文是我查閱許多資料,並且經過自己的實踐理解,總結出來的,非常感謝提供幫助的博文,這裏附上博文參考鏈接