web-dev-qa-db-ja.com

WindowsでのQt 5アプリの展開

QMLでいくつかのアプリケーションを作成しました(Qt 5の一部)。以前に行った質問( https://softwareengineering.stackexchange.com/questions/213698/deploying-qt-based-app-on-mac-os-x )で見つけましたアプリをOS Xにデプロイするためのソリューション(macdeployqtツールを使用)。

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からアクセス違反が発生します。正確なエラーは

セカンドチャンス例外0xC0000005(アクセス違反)がアドレス0x61C2C000の「QT5GUI.DLL」で発生しました。

不足しているものはありますか(たとえば、余分なDLLまたは構成ファイル)?

アプリケーション情報:

  • Qt 5.2.1で作成およびコンパイル
  • Quick/QMLを使用します。
  • ネットワークモジュールを使用します。
  • Webkitモジュールを使用します。
  • Bluetoothモジュールを使用します。
  • QMLファイルはQuick 2.2で書かれています
33
Alex Spataru

Qtフォーラムを数時間掘り下げた後、「qml」フォルダー(通常はC:/Qt/5.2.1/qmlにある)をアプリケーションのルートディレクトリにコピーする必要があることがわかりました。そうすると、アプリケーションの動的バージョンと静的バージョンの両方がVanillaシステムで機能しました。


プログラムディレクトリ(MinGW 4.8 32ビット、動的):

hyde のように、windeployqtツール(<qt path>\<version>\bin\windeployqt.exe)を使用して、必要なファイルをアプリケーションのフォルダーにコピーします。その後、必要なQMLコンポーネントを<qt path>\<version>\qml\からアプリケーションのフォルダーにコピーします。結果のフォルダーは次のようになります。

  • プラットフォーム(フォルダー)
  • QtQuick(フォルダー)
  • QtQuick.2(フォルダー)
  • 必要な他のQMLコンポーネント
  • app.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(フォルダー)
  • 必要な他のQMLコンポーネント
  • app.exe

クラッシュの原因は、Qt5Gui.dll(動的および静的)が実行中にQtQuick *フォルダーをロードしようとしましたが、それらを見つけることができなかった(したがって、ロード中にアプリケーションがクラッシュした)ためだと思います。

21
Alex Spataru

Qt 5.2以降、使用できるwindeployqtツールがあります。ヘルプを表示するには、コマンドラインから実行するだけです。しかし、基本的な使用法は、.exeファイルを指定すると、Qtの依存関係をコピーして使用することです。

--qmldirオプションを使用して、QMLファイルがどこにあるかをツールに知らせると、必要なQML依存関係を把握できます。

テストに関する注意:すべてが揃っていることを確認するには、コンピューターでQt SDKを使用せずにテストするか、または一時的に名前を変更します Qtディレクトリー。そうしないと、アプリケーションはそこから欠落しているファイルを見つける可能性があります...

35
hyde