QT学习笔记(三):Qt软件打包发布(QT5.8 _msvc2013_64+Win10_64)
QT學(xué)習(xí)筆記(三):Qt軟件打包發(fā)布(QT5.8 _msvc2013_64+Win10_64)
- 1.編譯方式介紹:
- 2.動(dòng)態(tài)編譯方式打包發(fā)布QT程序:
- 方法一:手動(dòng)復(fù)制
- 方法二:使用工具
- 問(wèn)題&解決:
環(huán)境:QT5.8 _msvc2013_64+Win10_64 (MSVC 編譯器)
1.編譯方式介紹:
Qt開(kāi)發(fā)的程序發(fā)布的時(shí)候經(jīng)常采用兩種方式:1)靜態(tài)編譯,可生成單一的可執(zhí)行文件;2)動(dòng)態(tài)編譯,需同時(shí)附上需要的dll文件。
靜態(tài)編譯
靜態(tài)編譯,是指把相關(guān)的庫(kù)也一并引入exe文件,這樣程序的尺寸就會(huì)很大,不過(guò)程序發(fā)布就會(huì)變得簡(jiǎn)單很多。
優(yōu)點(diǎn): 發(fā)布簡(jiǎn)單,單一文件,在移植時(shí)如果空間足夠,采用靜態(tài)編譯比較可靠
缺點(diǎn): 庫(kù)文件很大,更新程序版本不方便。每次升級(jí),都要重新分發(fā)所有的內(nèi)容。對(duì)QT而言,需要重新編譯靜態(tài)庫(kù)(非常耗時(shí)),且插件的使用比較麻煩;
動(dòng)態(tài)編譯(Qt默認(rèn))
動(dòng)態(tài)編譯,是指相關(guān)的庫(kù),以dll動(dòng)態(tài)鏈接庫(kù)的形式引用。動(dòng)態(tài)編譯的exe程序比較小,因?yàn)橄嚓P(guān)的庫(kù)都沒(méi)有包含進(jìn)來(lái)。所以程序發(fā)布的時(shí)候要把相關(guān)的庫(kù)也一并發(fā)布出去。
一般使用動(dòng)態(tài)編譯動(dòng)態(tài)鏈接Qt庫(kù),尤其代碼規(guī)模比較大,需要多人協(xié)作開(kāi)發(fā)時(shí),不同模塊按dll劃分比較方便,采用靜態(tài)鏈接是不現(xiàn)實(shí)的。
優(yōu)點(diǎn): 更新方便,發(fā)布多個(gè)產(chǎn)品時(shí),可以統(tǒng)一使用一個(gè)庫(kù)。
缺點(diǎn): 文件多、雜。
Debug版本
Debug 通常稱為調(diào)試版本,它包含調(diào)試信息,并且不作任何優(yōu)化,便于程序員調(diào)試程序。
Release 版本
Release 稱為發(fā)布版本,它往往是進(jìn)行了各種優(yōu)化,使得程序在代碼大小和運(yùn)行速度上都是最優(yōu)的。一般來(lái)說(shuō),release版的可執(zhí)行程序體積要比debug版小很多,而且由于剝離了許多調(diào)試信息及符號(hào)等,運(yùn)行效率相對(duì)也高一些,因此一般采用release編譯。
2.動(dòng)態(tài)編譯方式打包發(fā)布QT程序:
方法一:手動(dòng)復(fù)制
采用Qt動(dòng)態(tài)編譯,release版本的程序。需要將相應(yīng)的dll跟Qt可執(zhí)行程序exe文件放在一個(gè)目錄下:
所需的dll文件包括:
1)Qt模塊庫(kù)
Qt5Cored.dll
Qt5Guid.dll
Qt5Widgetsd.dll
2)ICU依賴庫(kù)
icudt51.dll
icuin51.dll
icuuc51.dll
3)EGL依賴庫(kù)
libEGLd.dll
libGLESv2d.dll
4)插件庫(kù)(Qt安裝目錄下即可找到D:\Software\Qt\Qt5.1.0\5.1.0\msvc2010\plugins\platforms)
圖片支持庫(kù):imageformats
音頻、視頻支持庫(kù):mediaservice
平臺(tái)支持庫(kù):platforms
等等…
注意:查找對(duì)應(yīng)的插件文件夾,粘貼到安裝目錄(一定要保持目錄結(jié)構(gòu),例如“platforms/***.dll”),詳細(xì)結(jié)構(gòu)見(jiàn)打包發(fā)布準(zhǔn)備的文件組織結(jié)構(gòu)。
5)VS運(yùn)行時(shí)庫(kù)msvcrt,如:
msvcp120.dll
msvcr120.dll
( 注意:發(fā)布程序的時(shí)候注意版本(Debug/Release)
如果是Debug版本的則是.前面帶d的(Qt5Cored.dll、Qt5Guid.dll、Qt5Widgetsd.dll)
如果是Release版本的則是.前面不帶d的(Qt5Core.dll、Qt5Gui.dll、Qt5Widgets.dll))
6)程序中引用的第三方庫(kù),如QWT,openCV,第三方庫(kù)的dll文件如qwt.dll、opencv_world300.dll。
**PS:
①.將exe文件在另一臺(tái)電腦上運(yùn)行時(shí),若缺少運(yùn)行所必需的dll文件,會(huì)報(bào)錯(cuò)——缺少dll文件。
②.C Runtime庫(kù):
問(wèn)題比較多的是VC的運(yùn)行時(shí)庫(kù) msvcrt。使用VC編譯的C或C++程序,都需要相關(guān)的C runtime庫(kù)才能運(yùn)行。本文采用的是VS2013編譯器,對(duì)應(yīng)的就是MSVCR120。進(jìn)入Microsoft.VC120.CRT 目錄:
就能找到C runtime庫(kù)(msvcp120.dll,msvcr120.dll,vccorlib120.dll)。
從vc2005開(kāi)始微軟加入了manifest機(jī)制控制運(yùn)行時(shí)庫(kù)的加載,如果用戶機(jī)器上未安裝過(guò)msvcrt的distribution pack,程序就不能運(yùn)行。簡(jiǎn)單的處理方法是把C runtime庫(kù)一并包含進(jìn)去,即將Microsoft.VC120.CRT 目錄下的文件(msvcp120.dll,msvcr120.dll,vccorlib120.dll)放到exe相同的目錄即可。應(yīng)用程序如果找不到系統(tǒng)安裝的msvcrt,就會(huì)加載自帶的庫(kù)文件。
③.Qt庫(kù)
編譯Qt后,將Qt生成路徑(…\build-untitled-Desktop_Qt_5_4_1_MSVC2013_OpenGL_64bit-Release\release)中的exe程序放到新建的package中,Qt程序中使用到的(在.pro文件中添加的)QtCore,QtGUI,xml,sql,multimedia等相關(guān)的動(dòng)態(tài)庫(kù)和調(diào)用它的exe一起放在同一個(gè)目錄中。
④.Qt的圖片解碼庫(kù)比如:jpeg、gif解碼等是以插件形式存在的,要包含imageformats文件夾中的dll文件,還有windows平臺(tái)相關(guān)的platforms,windows中的語(yǔ)音相關(guān)的audio等文件夾中包含的dll文件。
對(duì)于采用動(dòng)態(tài)編譯的Qt可執(zhí)行程序,如果不確定該程序使用了哪些必要的dll,可以使用工具查看該Qt可執(zhí)行程序使用了哪些dll,見(jiàn)下:
方法二:使用工具
1、 通過(guò)工具,查找程序運(yùn)行依賴的dll文件
最簡(jiǎn)單的方式是用Qt自帶的生成必備dll文件的 windepolyqt.exe工具 (D:\Qt\Qt5.8.0\5.8\msvc2013_64\bin 目錄下):windepolyqt xxx.exe
Qt for Windows - Deployment 官方文檔:
https://doc.qt.io/qt-5/windows-deployment.html#application-dependencies
使用方法:將Qt的bin目錄加入PATH環(huán)境,就可以直接在命令行使用windeployqt調(diào)用。將生成的xxx.exe可執(zhí)行文件復(fù)制到一個(gè)空的文件夾里,進(jìn)入這個(gè)文件夾 ,運(yùn)行windeployqt xxx.exe,則該執(zhí)行文件需要的大部分依賴文件都自動(dòng)拷貝到這個(gè)文件夾里了。
2、第三方的SDK庫(kù)添加
如果還使用了其他的第三方的SDK,如QWT,OpenCV等,就需要手動(dòng)將所需dll拷貝過(guò)來(lái),如果不知道還需要哪些dll文件,可以用**Dependency Walker (depends.exe)**和 微軟的進(jìn)程查看器 Process Explorer(procexp.exe) 來(lái)查看程序運(yùn)行時(shí)還缺少哪些dll。
3、 QT程序打包發(fā)布,用戶打包程序,變成(桌面)安裝包,可使用工具,如 NSIS,開(kāi)源工具Inno Setup進(jìn)行打包。
參考博客:
NSIS 官網(wǎng)下載
https://nsis.sourceforge.io/Download
Qt之NSIS打包 :(NIS Edit+NSIS 方式)
https://blog.csdn.net/xuhui_liu/article/details/71721556
Inno setup 打包教程:
https://jingyan.baidu.com/article/295430f1232df70c7e0050fe.html
https://blog.csdn.net/ruifangcui7758/article/details/6662646
https://blog.csdn.net/hebbely/article/details/78168071
Qt 軟件發(fā)布與打包:
https://blog.51cto.com/2678482/1616826
其他打包方式:
https://blog.csdn.net/qq_34719188/article/details/79947764
這樣之后,就得到了一個(gè)在其它沒(méi)有安裝Qt和VS的電腦上也可以運(yùn)行的Qt程序安裝包了。
問(wèn)題&解決:
完成上述第1步是及:從命令行模式進(jìn)入該文件夾執(zhí)行語(yǔ)句 windeployqt xxxx.exe 時(shí)提示錯(cuò)誤,無(wú)法找到“Visual Studio安裝目錄,未設(shè)置VCINSTALLDIR ”,如圖:
C:\Users\Leon\Desktop\新建文件夾> windeployqt HelloWorld.exe C:\Users\Leon\Desktop\Warning: Cannot find Visual Studio installation directory, VCINSTALLDIR is not set.解決方法:
直接用 “VS2013 開(kāi)發(fā)人員命令提示” 命令行去,執(zhí)行剛才的 windeployqt HelloWorld.exe,會(huì)將 “vcredist_x64.exe”(vc x64 運(yùn)行最少環(huán)境)程序放入當(dāng)前目錄。
1)先cd 進(jìn)執(zhí)行程序(HelloWorld.exe)所在目錄,再次運(yùn)行 windeployqt HelloWorld.exe:
D:\Microsoft Visual Studio 12.0>C: C:\>cd C:\Users\Leon\Desktop\新建文件夾 windeployqt HelloWorld.exe結(jié)果:
2)可能還是會(huì)漏掉一些包,要多在其他電腦上進(jìn)行測(cè)試,運(yùn)行時(shí)會(huì)提示缺少某個(gè)dll,想辦法找到該dll,這個(gè)dll你自己的電腦上一般都會(huì)有,全局搜下,復(fù)制粘貼到exe所在目錄下
總結(jié)
以上是生活随笔為你收集整理的QT学习笔记(三):Qt软件打包发布(QT5.8 _msvc2013_64+Win10_64)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: OpenCV学习笔记(八):形态学mor
- 下一篇: Python实现一个数组除以一个数