Qt 程序打包發佈總結

 
 
 

1.  概述

 當咱們用QT寫好了一個軟件,要把你的程序分享出去的時候,不可能把編譯的目錄拷貝給別人去運行。編譯好的程序應該是一個主程序,加一些資源文件,再加一些動態連接庫,高大上一些的還能夠作一個安裝文件。html

QT開發的程序發佈的時候常常採用兩種方式:linux

l  靜態編譯,可生成單一的可執行文件。sql

l  動態編譯,需同時附上須要的dll文件。shell

2.  發佈準備

無論採用哪一種方式,首先咱們要把項目的發佈作一些準備,例如:準備程序的圖標,將項目編譯成release等。  
安全

2.1. 設置程序圖標

應用程序的圖標分兩種:app

l  主窗口圖標,主要在程序運行時顯示在主窗口左上角,或在任務欄上顯示。函數

l  運行程序圖標,通常在桌面或文件夾中顯示的縮略圖標,能夠點擊後運行程序。工具

2.1.1.   設置主窗口圖標

首先在繪圖工具(例如Photoshop)中設計好圖標,圖標的分辨率最好大於32*32。圖標須要用*ico或*png的文件。若是想偷懶一點,直接去這裏(http://www.iconfinder.com/)下載,大量好看免費的圖標。post

將剛纔的生成的圖標文件放到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目錄的圖標路徑的下方。

一、   K桌面環境(KDE)

應用程序圖標能夠被全部用戶或者一個單一的用戶安裝使用。當前登陸到他們的KDE桌面的用戶能夠經過使用kde-config發現這些位置,例如,經過在終端窗口中鍵入執行下列操做:

 

kde-config --pathicon

 

一般狀況下,被輸出到stdout的以冒號分隔的路徑列表中包含了用戶特定的圖標路徑和全系統的路徑。下面這些目錄中,能夠根據在Icon ThemeSpecification中描述的約定來定位並安裝圖標。

若是您正在專門爲KDE開發,你不妨利用KDE build system的優點來配置您的應用程序。這能夠確保你的圖標被安裝在KDE的適當位置。

KDE的開發者網站是http://developer.kde.org/

二、   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平臺靜態編譯

一、下載源安裝程序,如 qt-everywhere-opensource-src-5.5.1.tar.gz

二、解壓到某一目錄

三、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)

四、沒問題後

 

make

 

五、make沒問題後再 

 

sudo make install

 

六、增長(或改變)環境變量: (也能夠不添加環境變量,使用絕對路徑進行編譯),在你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  

七、重啓

八、在終端測試一下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去分析它們,把要用的庫找過來。

相關文章
相關標籤/搜索