2014-03-04 61 views
29

我已經在QML(Qt 5的一部分)中編寫了幾個應用程序。在我之前提出的問題(https://softwareengineering.stackexchange.com/questions/213698/deploying-qt-based-app-on-mac-os-x)中,我找到了在OS X上部署應用程序的解決方案(使用macdeployqt工具)。在Windows上部署Qt 5應用程序

部署在Windows Qt4的應用程序很容易:

  1. 您在發佈模式編譯它。
  2. 您複製了必要的庫(DLL)。
  3. 你測試過了,它工作。

不幸的是,這種方法在Qt5中無法工作(我甚至在qwindows.dll文件中包含了平臺文件夾,但它不起作用)。經過幾天的嘗試,我放棄並編譯了一個靜態版本的Qt5。

再次,它沒有工作。該應用程序在安裝了Qt的PC上運行,但在「乾淨」的PC上崩潰。作爲一個側面說明,Windows 8/8.1系統不會給出關於應用程序崩潰的警告或消息。但是在Windows 7中,一條消息告訴我應用程序崩潰了。

我試過運行Dependency Walker(depends.exe),並且我的應用程序的靜態構建中的所有庫看起來都很好。

在Windows 8中,我沒有收到任何錯誤。但是在使用depends.exe分析應用程序後,我得到了源自QtGui.dll的訪問衝突。確切的錯誤是

地址0x61C2C000處的「QT5GUI.DLL」中發生第二次機會異常0xC0000005(訪問衝突)。

有什麼,我失蹤(說一個額外的DLL或配置文件)?

應用程序信息:

  • 書面和使用Qt 5.2.1
  • 編譯使用快速/ QML。
  • 使用網絡模塊。
  • 使用webkit模塊。
  • 使用藍牙模塊。
  • 的QML文件都寫在快速2.2
+0

什麼是確切的錯誤?你有沒有發生崩潰轉儲?你有沒有嘗試以某種方式分析崩潰轉儲? –

+0

在Windows 8中,我沒有收到任何錯誤。但是在使用depends.exe分析應用程序後,我得到了源自QtGui.dll的訪問衝突。 –

+1

確切的錯誤是「地址0x61C2C000」QT5GUI.DLL「中發生第二次機會異常0xC0000005(訪問衝突)。」 –

回答

18

幾個小時在Qt的論壇挖後,我發現我需要複製的「QML」文件夾(通常位於C:/Qt/5.2。 1/qml)到應用程序的根目錄。這樣做後,我的應用程序的動態和靜態版本都在vanilla系統上運行。


程序目錄(MinGW的4.8 32位,動態):

正如hyde說,使用windeployqt工具(<qt path>\<version>\bin\windeployqt.exe)到nescesary文件複製到你的應用程序的文件夾中。之後,將所需的QML組件從<qt path>\<version>\qml\複製到您的應用程序文件夾。生成的文件夾應類似於:

  • 平臺(文件夾)
  • QtQuick(文件夾)
  • QtQuick.2(文件夾)
  • ,你需要
  • 應用任何其他QML組件.exe
  • icudt51.dll
  • icuin51.dll
  • icuuc51.dll
  • libgcc_s_dw2-1.dll
  • 的libstdC++ - 6.dll
  • libwindthread-1.DLL
  • Qt5Core.dll
  • Qt5Gui.dll
  • Qt5Qml.dll
  • Qt5Quick .DLL
  • Qt5Network.dll
  • Qt5Widgets.dll

程序目錄(靜態)

編譯應用程序靜態,則所需的QML組件從<qt path>\<version>\qml\複製到應用程序的文件夾中。生成的文件夾應類似於:

  • QtQuick(文件夾)
  • QtQuick.2(文件夾)
  • ,你需要
  • APP.EXE
任何其他QML組件

我認爲墜機原因是,Qt5Gui.dll(動態和靜態)「試圖」加載QtQuick * FO在運行時,但無法找到它們(因此在加載過程中使應用程序崩潰)。

+0

對於靜態版本:應該不可能在您的.exe文件中包含所需的qml文件嗎? – bobbaluba

+0

我還必須複製C:\ Windows \ System32 \ msvcr110d.dll和C:\ Windows \ System32 \ msvcp110d.dll以使調試版本的部署工作。 (不需要發佈版本,但添加此註釋以防萬一有人在此嘗試將調試版本部署到未安裝調試運行時的系統上。) – wrdieter

+1

*「我發現需要複製」qml「文件夾「*您是否嘗試使用」--qmldir「選項? – Ilya

29

從Qt的5.2開始,有windeployqt工具,你可以使用。只需從命令行運行即可獲得幫助。但基本的用法是,給它的.exe文件,它將複製Qt依賴關係。

你將要使用--qmldir選項,讓工具知道你的QML文件,因此它可以計算出所需要的QML依賴。

關於測試的注意事項:確保你擁有一切,在沒有Qt SDK的計算機上測試,或者暫時重命名爲的Qt目錄。否則,應用程序可能會發現從那裏丟失的文件...

+1

我使用這個工具來部署我的動態應用程序,正如你所說的那樣,它有QML文件夾的問題。爲了解決這個問題,我只是複製了 /5.2.1/qml文件夾。部署的應用程序在沒有安裝Qt SDK的系統上工作。 –

+3

我的'windeployqt.exe' v5.7.0錯過了我的32位二進制文​​件的三個依賴:'libgcc_s_dw2-1.dll','libstdC++ - 6.dll'和'libwinpthread-1.dll'。必須從'\ Qt \ 5.7 \ mingw53_32 \ bin'手動添加它們。 – TranslucentCloud