QMLでいくつかのアプリケーションを作成しました(Qt 5の一部)。以前に行った質問( https://softwareengineering.stackexchange.com/questions/213698/deploying-qt-based-app-on-mac-os-x )で見つけましたアプリをOS Xにデプロイするためのソリューション(macdeployqtツールを使用)。
WindowsでのQt4アプリの展開は簡単でした。
残念ながら、このアプローチは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フォーラムを数時間掘り下げた後、「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\
からアプリケーションのフォルダーにコピーします。結果のフォルダーは次のようになります。
プログラムディレクトリ(静的)
アプリケーションを静的にコンパイルし、必要なQMLコンポーネントを<qt path>\<version>\qml\
からアプリケーションのフォルダーにコピーします。結果のフォルダーは次のようになります。
クラッシュの原因は、Qt5Gui.dll
(動的および静的)が実行中にQtQuick *フォルダーをロードしようとしましたが、それらを見つけることができなかった(したがって、ロード中にアプリケーションがクラッシュした)ためだと思います。
Qt 5.2以降、使用できるwindeployqt
ツールがあります。ヘルプを表示するには、コマンドラインから実行するだけです。しかし、基本的な使用法は、.exeファイルを指定すると、Qtの依存関係をコピーして使用することです。
--qmldir
オプションを使用して、QMLファイルがどこにあるかをツールに知らせると、必要なQML依存関係を把握できます。
テストに関する注意:すべてが揃っていることを確認するには、コンピューターでQt SDKを使用せずにテストするか、または一時的に名前を変更します Qtディレクトリー。そうしないと、アプリケーションはそこから欠落しているファイルを見つける可能性があります...