Qt 如何打包一個軟體?

比如我編好了,然後放在沒有安裝 Qt 的 Win7 電腦上運行。


YY語音從4.0版本開始是基於Qt framework開發的,而我正是這個項目的技術負責人。

決定是否採用某framework之前,首先要確定是不是有發布上的問題,畢竟YY語音作為一個服務於數千萬用戶的客戶端軟體,面臨的用戶軟硬體環境是比較複雜的,而且一旦遇到無法安裝或者安裝後不能運行之類的兼容性問題會導致大量的用戶流失。

我在預研階段測試了很多不同的軟硬體環境,Qt本身倒是沒什麼問題,問題比較多的反而是VC的運行時庫 msvcrt。

我們採用的是動態鏈接Qt庫,因為YY語音的代碼規模比較大,需要多人協作開發,不同模塊按DLL劃分比較方便,採用靜態鏈接是不現實的。

YY語音採用的是 Qt 4.7.1版本。

Qt庫和調用它的 EXE DLL放在同一個目錄就可以了,有個問題要注意,Qt的圖片解碼庫比如jpeg gif解碼等是以插件形式存在的發布時要帶上 Qt的imageformats裡面的幾個dll,通常就是 qjpeg4.dll qgif4.dll qico4.dll ,另外為了讓Qt可以找到這些插件需要設置下Qt插件的載入目錄

在程序啟動時調用 QCoreApplication::setLibraryPaths(libPaths); 把 imageformats所在的目錄放到 libPaths里。

VC運行時庫的安裝是個麻煩問題,YY語音採用的是VC2008編譯器,從vc2005開始微軟加入了manifest機制控制運行時庫的載入,不再像vc2003及之前的版本那樣只要放到exe目錄就行了。如果用戶機器上安裝過msvcrt的分發包則沒問題,否則程序不能運行。

簡單的處理方法是 把 Microsoft.VC90.CRT 目錄及目錄下的文件放到exe相同的目錄即可。

這樣的話,應用程序如果找不到系統安裝的msvcrt,就會載入自己帶的那份。

Microsoft.VC90.CRT這個目錄可以在vc安裝的目錄找到,搜索下吧。

假設 你的 app安裝到 &目錄下,那麼這個應用安裝後的目錄下的結構可能是這樣的。

&
yourapp.exe
yourdll1.dll
yourdll2.dll
QtCore4.dll
QtGui4.dll
&
qgif4.dll
qjpeg4.dll
qico4.dll
&
Microsoft.VC90.CRT.manifest
msvcr90.dll
msvcp90.dll

大家也可以下載安裝YY語音參考下安裝目錄下的文件。


用release模式編譯,將生成的xxx.exe可執行文件複製到一個空的文件夾里

然後打開命令行,進入這個文件夾 windeployqt xxx.exe,會自動把該執行文件需要的依賴文件複製到這個文件夾里(前提是你Qt的環境變數配置好了)

這個文件夾你隨便拷到哪個電腦上,都可以點擊exe執行


QT編譯後是本機代碼,不需要對方安裝QT,只要你把用到的dll一起打包給他就行了


我不建議靜態編譯,靜態編譯後會很大,看著很不爽,打包的話,可以把需要的dll找全,具體可以上網搜搜,或者把exe文件放到一個比較乾淨的系統(例如重裝後的),看看提示缺什麼。另外,類似於.net,qt也有一個framework的,可以安裝qt 的 framework,具體我也沒用過,你上qt官網那有


文檔看過了么?

Qt 5.1 Doc: Deploying Qt Applications http://qt-project.org/doc/qt-5.1/qtdoc/deployment.html

還可以看看Qt Installer Framework http://qt-project.org/doc/qtinstallerframework-1.4/index.html


QT開發的程序在windows,linux,MAC OS X平台的打包發布方法,我做了一個總結,參看blog:《Qt 程序打包發布總結》Qt 程序打包發布總結


對於採用鏈接DLL方式的QT可執行程序,如果不確定該程序使用了哪些必要的DLL,可以使用這個工具:Dependency Walker (depends.exe) Home Page 查看該QT可執行程序使用了哪些DLL,然後將相應的DLL跟QT可執行程序放在一個目錄下,使用打包工具比如開源工具 Inno Setup:http://www.jrsoftware.org/isinfo.php 進行打包,這樣就得到了一個在其它沒有安裝QT的電腦上也可以運行的安裝包了。


windows 下Qt提供了一個工具可以方便部署工程http://doc.qt.io/qt-5/windows-deployment.html

Usage: windeployqt [options] [files]
Qt Deploy Tool 5.6.0

The simplest way to use windeployqt is to add the bin directory of your Qt
installation (e.g. &) to the PATH variable and then run:
windeployqt &


If ICU, ANGLE, etc. are not in the bin directory, they need to be in the PATH
variable. If your application uses Qt Quick, run:
windeployqt --qmldir &

&

Options:
-?, -h, --help Displays this help.
-v, --version Displays version information.
--dir & Use directory instead of binary directory.
--libdir &

Copy libraries to path.
--plugindir &

Copy plugins to path.
--debug Assume debug binaries.
--release Assume release binaries.
--pdb Deploy .pdb files (MSVC).
--force Force updating files.
--dry-run Simulation mode. Behave normally, but do not
copy/update any files.
--no-plugins Skip plugin deployment.
--no-libraries Skip library deployment.
--qmldir & Scan for QML-imports starting from directory.
--no-quick-import Skip deployment of Qt Quick imports.
--no-translations Skip deployment of translations.
--no-system-d3d-compiler Skip deployment of the system D3D compiler.
--compiler-runtime Deploy compiler runtime (Desktop only).
--no-compiler-runtime Do not deploy compiler runtime (Desktop only).
--webkit2 Deployment of WebKit2 (web process).
--no-webkit2 Skip deployment of WebKit2.
--json Print to stdout in JSON format.
--angle Force deployment of ANGLE.
--no-angle Disable deployment of ANGLE.
--no-opengl-sw Do not deploy the software rasterizer library.
--list & Print only the names of the files copied.
Available options:
source: absolute path of the source files
target: absolute path of the target files
relative: paths of the target files, relative
to the target directory
mapping: outputs the source and the relative
target, suitable for use within an
Appx mapping file
--verbose & Verbose level.

Qt libraries can be added by passing their name (-xml) or removed by passing
the name prepended by --no- (--no-xml). Available libraries:
bluetooth clucene concurrent core declarative designer designercomponents
enginio gui qthelp multimedia multimediawidgets multimediaquick network nfc
opengl positioning printsupport qml qmltooling quick quickparticles quickwidgets
script scripttools sensors serialport sql svg test
websockets widgets winextras xml xmlpatterns webenginecore webengine
webenginewidgets 3dcore 3drenderer 3dquick 3dquickrenderer 3dinput geoservices
webchannel

Arguments:
[files] Binaries or directory containing the binary.


表示動態打包加入.dll會遇到各種坑(脫離開發環境會出現一系列問題),對於編譯小白還是建議無腦靜態編譯,最近靜態編譯通過一個程序,只要四步就可以:

  • 步驟一:安裝minGW
  • 步驟二:取得Qt靜態編譯後的版本

  • 步驟三:在Qt裡面進行配置
  • 步驟四:新建靜態項目

可以看看我的這篇博文: Qt 靜態編譯 絕對簡單效率~


建議看新手看霍亞飛寫的《Qt Creator快速入門》,裡面很詳細,資源可以到Qter社區下載。


nsis+duilib。。具體可搜索


說下Mac上面打包的坑吧......

Mac平台的Qt有提供一個macdeployqt的程序,用來提供複製需要的framework到程序中的功能,但是我試過qmake,make後編譯再經過macdeployqt後程序並不能直接在別的機器上運行!

原因在與macdeployqt裡面複製的framework裡面link的framework地址是系統裡面的,而不是程序里的,所以要對複製的framework修改link的framework,不知道是不是我直接用brew過來的qt,沒用qt creator的問題,簡直大坑......


樓主。。問題解決了嗎?請問怎麼解決的。。我用windeployqt+Enima virtual box打包了一個exe 無QT環境的電腦雙擊就沒有動靜了。 能不能指點一下


可以嘗試靜態編譯。網上有很多介紹可以查閱,不過可能遇到各種問題。


推薦閱讀:

為什麼棧沒有讀取並彈出的函數?
這個程序哪錯了?求大神指點
大家是怎麼學習Pyqt5的?
C++的模板元編程是否降低運行效率?
如何控制python多線程的退出?

TAG:編程 | QtC開發框架 |