1. 概述
當我們用QT寫好了一個軟件,要把你的程序分享出去的時候,不可能把編譯的目錄拷貝給別人去運行。編譯好的程序應該是一個主程序,加一些資源文件,再加一些動態鏈接庫,高大上一些的還可以做一個安裝文件。
QT開發的程序發布的時候經常采用兩種方式:
l 靜態編譯,可生成單一的可執行文件。
l 動態編譯,需同時附上需要的dll文件。
2. 發布准備
不管采用哪種方式,首先我們要把項目的發布做一些准備,例如:准備程序的圖標,將項目編譯成release等。
2.1. 設置程序圖標
應用程序的圖標分兩種:
l 主窗口圖標,主要在程序運行時顯示在主窗口左上角,或在任務欄上顯示。
l 運行程序圖標,一般在桌面或文件夾中顯示的縮略圖標,可以點擊后運行程序。
2.1.1. 設置主窗口圖標
首先在繪圖工具(例如Photoshop)中設計好圖標,圖標的分辨率最好大於32*32。圖標需要用*ico或*png的文件。如果想偷懶一點,直接去這里(http://www.iconfinder.com/)下載,大量好看免費的圖標。
將剛才的生成的圖標文件放到yourProjectFolder/Resources/images目錄下,或者任意一個程序可以找到的位置。最好將圖標文件添加到qrc中統一管理,qrc文件的格式如下:
<RCC>
<qresourceprefix="/background">
<filealias="mainlogo">christmas_stocking.png</file>
</qresource>
</RCC>
然后再主窗口中使用,代碼如下,代碼很簡單,不過記住這句代碼一定要放到Mainwindow的構造函數里去,不然不會work。
/*setwindowicon*/
setWindowIcon(QIcon(QStringLiteral(":/background/mainlogo")));
程序運行后的效果如下:

2.1.2. 設置運行程序的圖標
設置運行程序的圖標在各個平台是各不相同的,下面分別介紹。首先准備分辨率最好大於32*32的圖標文件。圖標需要用*ico的文件。
1) Windows平台
A)使用Visual Studio IDE開發工具
如果使用的是VisualStudio IDE開發工具,例如在VS2015中,項目上右擊,添加,資源,選擇icon,然后將之前准備的*ico圖標文件導入,確定之后項目中就會出現一個 projectname.rc 的文件。


B)使用QTCreator的IDE開發工具
如果你是使用qmake生成makefile文件或使用QT Creator IDE,那么按下面三步實施:
l 第一步:創建一個包含圖標圖像的ICO文件,並將其保存在資源文件目錄下,例如命名為:myapp.ico;
l 第二步:創建一個.rc文件,包含如下內容:
IDI_ICON1 ICON DISCARDABLE "myapp.ico"
l 第三步:在工程文件myapp.pro文件中寫入如下內容:
RC_FILE = myapp.rc
再次編譯程序,即可達到效果,效果圖如下:

2) Mac OS X平台
雖然許多程序可以創建圖標文件(.icns),推薦的方法是使用由蘋果公司提供的程序iconutil。Iconutil是一個命令行工具,它允許您導入多個不同大小的圖標(在不同的上下文中使用),並能壓縮文件。在您的項目目錄中將所有一系列的圖標保存在一個文件中。
如果您正使用qmake生成makefile文件,您只需要將一個單一的行添加到您的.pro工程文件。例如,如果您的圖標文件的名稱是myapp.icns,並且您的項目文件名稱是myapp.pro,加入這一行到myapp.pro:
ICON = myapp.icns
這將確保qmake把你的圖標放在適當的位置並為圖標創建一個Info.plist條目。
如果你不使用qmake,你必須手動執行以下幾點:
1) 為您的應用程序(使用PropertyListEditor,在Developer/Applications中可以找到)創建一個Info.plist文件。
2) 在Info.plist文件(同樣,使用PropertyListEditor)關聯您的.icns記錄和CFBundleIconFile記錄。
3) 將Info.plist文件復制到你的應用程序包的Contents目錄。
4) 復制.icns文件到你的應用程序包的Contents/Resoures目錄。
3) 通用的Linux平台
在本節中,我們簡要地介紹一下在兩種常見的Linux桌面環境:KDE和GNOME,為應用程序提供圖標的相關問題 。為這兩種桌面,用來描述應用程序圖標的核心技術是相同的,也可以適用於其他,但具體到每一個來講也有各自的細節。對使用這些Linux桌面系統的標准信息的主要來源是freedesktop.org。有關其他Linux桌面的信息,請參閱您感興趣的桌面文檔。
通常情況下,用戶不直接使用可執行文件,而是通過點擊桌面上的圖標來啟動應用程序。這些圖標是包含帶有關於它的圖標信息的應用程序的描述表示的“桌面項” 文件。這兩種桌面環境都能夠在這些文件中檢索信息,並且可以用它們來生成應用程序的快捷方式到桌面上,在開始菜單中,或者在面板上。
有關桌面項文件的更多信息,可以在Desktop EntrySpecification中找到。
雖然桌面項文件可以有效地封裝應用程序的詳細信息,我們仍然需要將圖標存儲在每個桌面環境中的常規位置。用於圖標的一些位置在Icon ThemeSpecification中給出了。
雖然用於定位圖標的路徑依賴於在桌面上的使用和它的配置,下面所有這些目錄結構應該遵循相同的模式:子目錄都按照主題,圖標大小和應用程序類型進行組織。 通常,應用程序圖標被添加到高彩主題,因此方形的應用程序圖標的大小為32像素,它將被存儲在hicolor/32x32/apps目錄的圖標路徑的下方。
1、 K桌面環境(KDE)
應用程序圖標可以被所有用戶或者一個單一的用戶安裝使用。當前登錄到他們的KDE桌面的用戶可以通過使用kde-config發現這些位置,例如,通過在終端窗口中鍵入執行下列操作:
kde-config --pathicon
通常情況下,被輸出到stdout的以冒號分隔的路徑列表中包含了用戶特定的圖標路徑和全系統的路徑。下面這些目錄中,可以根據在Icon ThemeSpecification中描述的約定來定位並安裝圖標。
如果您正在專門為KDE開發,你不妨利用KDE build system的優勢來配置您的應用程序。這可以確保你的圖標被安裝在KDE的適當位置。
KDE的開發者網站是http://developer.kde.org/。
2、 GNOME
應用程序圖標都存儲在包含與體系結構無關文件的一個標准全系統目錄下。這個位置可以通過使用gnome-config來確定,例如,通過在一個終端窗口中鍵入以下命令:
gnome-config--datadir
輸出在標准輸出stdout的路徑指的是包含一個名為pixmaps目錄的位置;這個pixmaps目錄中的目錄結構中在Icon ThemeSpecification中進行了描述。
如果您正在專門為GNOME開發,你可能希望使用一組標准的GNU Build Tools,在GTK+/GnomeApplication Development book的相關章節也作了說明。這可以確保你的圖標被安裝在為GNOME中的適當位置。
2.2. 編譯release版本
注意將運行程序編譯方式設置成Release,因為debug版本的程序中包含了調試信息,可以用來調試。而真正要發布程序時,要使用release版本,這樣可以減少發布程序的體積同時增加軟件的安全。

上圖演示在Qt Creator中的設置方式,選中IDE左邊的側邊欄的項目,然后再構建設置中將構建配置設置為Release。

上圖演示在VS2015中的設置方式,選中IDE右邊的解決方案管理器中的項目,然后在IDE上邊的工具欄中將構建配置設置為Release。
3. 發布程序
安裝QT SDK 后,默認采用的是動態鏈接庫的編譯方式,如果需要發布程序,需要在可執行的文件中添加必須的動態鏈接庫,然而有些動態鏈接庫文件很大,這並不是我們想要的結果。
最好的辦法是提交一個靜態鏈接的程序。但是安裝的Qt是動態編譯的,要生成靜態的版本,就需要自己重新進行編譯。
3.1. 靜態編譯
l 優點,發布簡單,單一文件。
l 缺點,庫文件很大,更新程序版本不方便。每次升級,都要重新分發所有的內容。
靜態發布雖然不需要較多的dll,發布簡單、方便,但是往往會牽扯到授權問題(詳情請查看Qt LGPL授權),動態發布則可以避免。。。如果附帶了Qt的dll,就相當於發布了Qt的dll,而這些庫是屬於Qt的,這足以保證使用者知道程序使用了LGPL版本的Qt。
1) Windows平台靜態編譯
靜態編譯首先需要將
mingw平台靜態編譯,在編譯Qt的時候,有個configure.exe程序,
configure.exe-static -platform win32-g++
可以產生靜態編譯項目文件。然后,
mingw32-makesub-src
就可以編譯出靜態庫。如果只是用來分發程序,也可以mingw32-makerelease sub-src只編譯一個靜態庫。
VC2015平台,在編譯Qt的時候,configure.exe-static-platform win32-msvc2015
然后nmakesub-src或者nmake release sub-src完成靜態編譯。
再然后,就是把你的程序重新用靜態編譯的Qt再編譯一次。
你會得到一個非常大的可執行程序。推薦使用AspPack壓縮一下。就可以發給用戶了。
2) linux平台靜態編譯
1、下載源安裝程序,如 qt-everywhere-opensource-src-5.5.1.tar.gz
2、解壓到某一目錄
3、cd 進入解壓后的目錄,命令:
./configure-static -release -qt-zlib -qt-gif -qt-libpng -qt-libmng -qt-libjpeg -nomakedemos -nomake examples -qt-sql-sqlite -prefix /usr/local/Trolltech/Qt-5.5.1_static
參數-static 指的是要采用靜態編譯Qt的方法
參數-release指的是只編譯release版本的庫
參數-qt-zlib -qt-gif-qt-libpng -qt-libmng -qt-libjpeg 是更好確定Qt編譯出的程序能在目前不知的系統下運行。
參數-nomake demos-nomake examples 指的是不編譯demos和examples
參數-qt-sql-sqlite 如果沒有這個參數,configure的時候,可能會提示sqlite 有問題而中止。
參數 -prefix/usr/local/Trolltech/Qt-5.5.1_static 指明靜態編譯的Qt安裝的目錄,命名Qt-5.5.1_static是為了區別動態編譯安裝的Qt,因為如果沒有這個參數,安裝時會覆蓋之前動態編譯安裝的Qt(如果有的話)。
u 注: 如果出現錯誤:Basic XLibfunctionality test failed!
You might need to modify theinclude and library search paths by editing
QMAKE_INCDIR_X11 andQMAKE_LIBDIR_X11
解決辦法:yum installlibX*
(如果是Ubuntu也可運行sudo apt-getinstall libx11-dev libxext-dev libxtst-dev)
4、沒問題后
make
5、make沒問題后再
sudo make install
6、增加(或改變)環境變量: (也可以不添加環境變量,使用絕對路徑進行編譯),在你home目錄下你的的名字的目錄中,在.profile文件中追加(或改變)如下環境變量:(為Qt設置一些特定的環境變量,這個很重要!.profile文件是隱藏的,可在你的名字目錄下,按Ctrl+H顯示所有文件查看到)
QTDIR=/usr/local/Trolltech/Qt-5.5.1_static/
PATH=$QTDIR/bin:$PATH
MANPATH=$QTDIR/doc/man:$MANPATH
LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
export QTDIR PATHMANPATH LD_LIBRARY_PATH
7、重啟
8、在終端測試一下qmake
3) MAC OS X系統平台靜態編譯
在MAC OS X系統平台下靜態編譯QT應用還是比較麻煩的,首先需要靜態編譯QT應用依賴的各個庫,然后再進行連接生成運行文件,具體步驟參看鏈接:http://doc.qt.io/qt-5/osx-deployment.html。
3.2. 附加Dll文件
l 優點,更新方便,發布多個產品時,可以統一使用一個庫。
l 缺點,文件多、雜。
Qt官方開發環境默認使用動態鏈接庫方式,在發布生成的可執行程序時,我們需要復制一大堆動態庫,如果自己去復制動態庫,很可能丟三落四,導致程序在別的電腦里無法正常運行。 因此 Qt 官方開發環境里自帶了一個部署工具來幫助開發者自動拷貝大部分的依賴庫。在不同的平台使用方式也有所不同。
1) Windows平台
Windows開發環境下windeployqt工具 (如果你已經將Qt的bin目錄加入PATH環境,那么你可以直接在命令行使用windeployqt調用.)。首先,將項目中的release文件中的可執行文件拷到一個新建的文件夾中,例如project.exe,用Qt自帶的生成必備的dll文件的程序windeployqt,來把必要的動態庫拷到該文件夾中,打開命令行,輸入windeployqtproject.exe,這時候大部分的dll文件都自動拷貝過來了,但是如果項目還用了一些其他的SDK,比如OpenCV,Chartdir51等等,就需要手動將所需dll拷貝過來,如果不知道還需要哪些軟件,可以用Dependency Walker來查看缺少哪些dll文件。
拷貝完成后文件夾下的文件清單如下:
注意:如果發布的應用是Qt Quick Application應用,那么命令行需要加上QML的安裝目錄。命令中的D:\Qt\Qt5.5.1\qml是qml的安裝目錄,請換成你自己的qml安裝目錄!!!!!
windeployqt hello.exe--qmldir D:\Qt\Qt5.5.1\qml
接下來要高大上的朋友就可以用Enigma VirtualBox軟件虛擬化工具將多個文件封裝到應用程序主文件,從而制作成為單執行文件的綠色軟件。
2) linux平台
在X11平台下qt程序,首先准備好程序中需要使用的資源,庫和插件...,比如你的可運行程序取名叫作panel,那把你的panel,那些libQt*.so.4和libQt*.so.4.6.0(鏈接和共享庫都要)放在同一目錄下(也可以不同,只要小小修改下shell文件).plugins就不多說了。
在程序的同目錄下,新建一個空文檔,取名panel.sh (文件名與程序名同名,擴展名為sh,shell文件)。在panel.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$*
保存文件,退出。在終端給文件+x屬性: 切換到程序的目錄,輸入
chmod +x panel.sh
然后運行shell文件就行了(確保panel程序具備X屬性),它會自動更改環境變量,運行程序。
如果要調試shell文件,只需要在終端輸入:
sh -x panel.sh
這樣就ok了。
如果需要把執行程序制作成DEB或RPM包的話請參考鏈接:
Deploying aQt5 Application Linux: https://wiki.qt.io/Deploying_a_Qt5_Application_Linux
3) MAC OS X系統平台
由於Qt的庫並不是OS X標配的,所以我們要自己去復制庫到app包里,才可以讓app在其他未安裝Qt的電腦上運行。
比較幸運的是,Qt為我們提供了macdeployqt工具,借助於此,在OS X上發布Qt寫的程序幾乎是所有平台中最簡單的。
注:我電腦配置了Qt的bin環境,所以可以直接使用macdeployqt,如果沒配置,可以用絕對路徑去找。
1.發布widgets程序
a) 這個比較方便。選擇Release模式,編譯
b) 運行macdeployqt
對於我的工程,命令是:
macdeployqt /Users/Ocean/Desktop/build-untitled-Desktop_5_5_1_64bit-Release/untitled.app-dmg
然后回車,就打包好了。之后我們會發現,app目錄下多了一個dmg文件
此dmg文件,里面的app就是我們發布的app了。把dmg拷貝給別人,別人就可以直接使用了。
l 注:如果直接拷貝app文件給別人,別人是無法直接運行的,會有權限問題(要用chmod給可執行文件加上x權限才可以運行)。而壓縮過(zip或者dmg)后,拷貝給別人,別人是可以直接運行,沒有權限問題。
l 注:-dmg的意思就是在拷貝好庫后,生成一個dmg文件,可以不加這個參數。
2.發布quick2程序
這個相對麻煩一點
a) 選擇Release模式,編譯
b) 打開終端,先切換編譯的目標目錄下
對於我的工程,命令是:
cd /Users/Ocean/Desktop/build-untitled-Desktop_5_5_1_64bit-Release
c) 運行macdeployqt
對於我的工程,命令是:
macdeployqt untitled.app-qmldir=../untitled -dmg
然后回車,就打包好了。
l 注1:和widgets發布程序不同,untitled.app 這個名字,要直接輸入,不要寫 ./untitled.app 或者是其他的 絕對/相對 路徑,不然打包出來的文件無法使用!!會報錯!!!
l 注2:-qmldir=../untitled的意思就是說在../untitled 目錄下有qml文件,讓macdeployqt去分析它們,把要用的庫找過來。





