環境:QT5.4.1(msvc2013_64_opengl),Win7 64bit
編譯方式
Qt開發的程序發布的時候經常采用兩種方式:1)靜態編譯,可生成單一的可執行文件;2)動態編譯,需同時附上需要的dll文件。
靜態編譯
靜態編譯,是指把相關的庫也一並引入exe文件,這樣程序的尺寸就會很大,不過程序發布就會變得簡單很多。
動態編譯(Qt默認)
動態編譯,是指相關的庫,以dll動態鏈接庫的形式引用。動態編譯的exe程序比較小,因為相關的庫都沒有包含進來。所以程序發布的時候要把相關的庫也一並發布出去。
一般使用動態編譯動態鏈接Qt庫,尤其代碼規模比較大,需要多人協作開發時,不同模塊按dll划分比較方便,采用靜態鏈接是不現實的。
Debug版本
Debug 通常稱為調試版本,它包含調試信息,並且不作任何優化,便於程序員調試程序。
Release 版本
Release 稱為發布版本,它往往是進行了各種優化,使得程序在代碼大小和運行速度上都是最優的。一般來說,release版的可執行程序體積要比debug版小很多,而且由於剝離了許多調試信息及符號等,運行效率相對也高一些,因此一般采用release編譯。
打包發布
本文采用Qt動態編譯,release版本的程序。需要將相應的dll跟Qt可執行程序exe文件放在一個目錄下。如下例所示:
所需的dll文件包括:
1、C Runtime庫msvcrt,使用VC編譯的C或C++程序,都需要相關的C runtime庫才能運行,如該例程中的msvcp120.dll,msvcr120.dll等;
2、icudt53.dll、icuin53.dll、icuuc53.dll、Qt5Widgets.dll、Qt5Core.dll、Qt5Gui.dll等 (Qt 的bin目錄中)動態引用的Qt庫;
3、platforms、imageformats、audio等運行時加載的dll 文件夾;
4、程序中引用的第三方庫,如QWT,openCV,第三方庫的dll文件如qwt.dll、opencv_world300.dll。
將exe文件在另一台電腦上運行時,若缺少運行所必需的dll文件,會報錯——缺少dll文件。
C Runtime庫
問題比較多的是VC的運行時庫 msvcrt。使用VC編譯的C或C++程序,都需要相關的C runtime庫才能運行。本文采用的是VS2013編譯器,對應的就是MSVCR120。進入Microsoft.VC120.CRT 目錄:${VS Install Dir}\VC\redist\x64\Microsoft.VC120.CRT,就能找到C runtime庫(msvcp120.dll,msvcr120.dll,vccorlib120.dll)。
從vc2005開始微軟加入了manifest機制控制運行時庫的加載,如果用戶機器上未安裝過msvcrt的distribution pack,程序就不能運行。簡單的處理方法是把C runtime庫一並包含進去,即將Microsoft.VC120.CRT 目錄下的文件(msvcp120.dll,msvcr120.dll,vccorlib120.dll)放到exe相同的目錄即可。應用程序如果找不到系統安裝的msvcrt,就會加載自帶的庫文件。
Qt庫
編譯Qt后,將Qt生成路徑(..\build-untitled-Desktop_Qt_5_4_1_MSVC2013_OpenGL_64bit-Release\release)中的exe程序放到新建的package中,Qt程序中使用到的(在.pro文件中添加的)QtCore,QtGUI,xml,sql,multimedia等相關的動態庫和調用它的exe一起放在同一個目錄中。
Qt的圖片解碼庫比如jpeg、gif解碼等是以插件形式存在的,要包含imageformats文件夾中的dll文件,還有windows平台相關的platforms,windows中的語音相關的audio等文件夾中包含的dll文件。
對於采用動態編譯的Qt可執行程序,如果不確定該程序使用了哪些必要的dll,可以使用工具查看該Qt可執行程序使用了哪些dll。
工具
1、 查找程序運行依賴的dll文件
最簡單的方式是用Qt自帶的生成必備dll文件的windepolyqt工具:
windepolyqt xxx.exe
如果將Qt的bin目錄加入PATH環境,就可以直接在命令行使用windeployqt調用。將生成的xxx.exe可執行文件復制到一個空的文件夾里,進入這個文件夾 ,運行windeployqt xxx.exe,則該執行文件需要的大部分依賴文件都自動拷貝到這個文件夾里了。
如果還使用了其他的第三方的SDK,如QWT,OpenCV等,就需要手動將所需dll拷貝過來,如果不知道還需要哪些dll文件,可以用Dependency Walker (depends.exe)和 微軟的 procexp.exe 來查看程序運行時還缺少哪些dll。
2、 一個Qt的安裝包制作工具,用戶打包程序,變成(桌面)安裝包,如開源工具Inno Setup(http://www.jrsoftware.org/isinfo.php)進行打包。
這樣之后,就得到了一個在其它沒有安裝Qt和VS的電腦上也可以運行的Qt程序安裝包了。