QML(Qt)アプリケーションの配布方法(Windows編)

マルチプラットフォームに簡単に開発できるQtですが、まだまだ配布準備が面倒だったりするのが玉にキズ。
配布に必要になるファイルや場所をまとめました。

詳細(公式)な情報は「QML(Qt)関連の情報まとめ」にまとめたリリース関連の先を御覧ください。


/// 今回のポイント ///
・必要なDLLを同梱する必要がある
・DLLの入手元はコンパイラを「MinGW」と「VisualC++」のどちらを使うかで変わる
・Qt Quickアプリケーションの場合は、qmlファイルも同梱する
Qtプラグインを使用している場合は追加のDLLが必要になる

現状わかっている範囲で記載しますがもしかしたらアプリで使用している機能によっては追加で必要な内容があるかもしれません。
パスやファイル名に含まれるバージョン番号的なものは環境によって読み替えてください。
 QtSDKは4.7.4で記載します。
 VC++については基本9.0(2008)で記載します。


/// DLLの入手パス ///
・MinGW
 必須DLL : C:\QtSDK\Desktop\Qt\4.7.4\mingw\bin
 Qtプラグイン : C:\QtSDK\Desktop\Qt\4.7.4\mingw\plugins
・VC++
 必須DLL : C:\QtSDK\Desktop\Qt\4.7.4\msvc2008\bin
 Qtプラグイン : C:\QtSDK\Desktop\Qt\4.7.4\msvc2008\plugins


/// DLLとQMLの配置場所 ///
基本的に実行ファイル(*.exe)と同じフォルダに配置します。
QtプラグインのDLLはDLLが保存されているフォルダごとコピーして配置するイメージになります。
(実際にはデバッグ用とかLinux用の*.aもあるので必要なファイルだけにしましょう)
QMLファイルはビルドフォルダにできる「qml」フォルダを丸ごと実行ファイルと同じフォルダにコピーします。
 実行ファイル : <ApplicationFolder>\*.exe
 必須DLL : <ApplicationFolder>\*.dll
 Qtプラグイン : <ApplicationFolder>\<qtpluginsfolder>\*.dll
 QMLファイル : <ApplicationFolder>\qml\<project name>\*.qml / *.js

sqliteのプラグインを使用する場合は下記の用な感じです。
 <ApplicationFolder>\sqldrivers\qsqlite4.dll


/// コンパイラに依存して必要なDLL ///
・MinGW
 mingwm10.dll
 libgcc_s_dw2-1.dll
・VC++
 msvcr90.dll
 msvcp90.dll


/// Qtとして必要なDLL ///
ファイル名はコンパイラに関係なく同じですが入手元が違いますので注意です。
・必須(QMLアプリの場合)
 QtCore4.dll
 QtGui4.dll
 QtDeclarative4.dll
・使用している機能によって選択
 Qt3Support4.dll
 QtCLucene4.dll
 QtDesigner4.dll
 QtDesignerComponents4.dll
 QtHelp4.dll
 QtMultimedia4.dll
 QtNetwork4.dll
 QtOpenGL4.dll
 QtScript4.dll
 QtScriptTools4.dll
 QtSql4.dll
 QtSvg4.dll
 QtTest4.dll
 QtWebKit4.dll
 QtXml4.dll
 QtXmlPatterns4.dll
 
 
/// 必要なDLLの確認方法 ///
Dependency Walker」というアプリを使用して確認します。
Dependency Walkerを実行して確認したい自分のアプリの実行ファイル(*.exe)を開きます。
不足しているDLLがあると印がつきますので不足しているDLLを実行ファイルと同じディレクトリに置いて開き直します。

ぶっちゃけ、コンパイラ依存のDLLさえ用意して実行ファイルを叩けばhogehoge.dllが足りないと言われるので順番にコピーしてくるだけです。いいのかな?(笑


/// Qtプラグインを使用している場合に必要なDLL ///
プラグインとして用意されている機能は「How to Create Qt Plugins #Static Plugins」に記載されています。
DBアクセスや画像処理、文字コード関連の処理などなど。
たくさんあるので幾つか例をピックアップします。
・画像関連
 imageformats\qgif4.dll
 imageformats\qico4.dll
 imageformats\qjpeg4.dll
 imageformats\qmng4.dll
 imageformats\qsvg4.dll
 imageformats\qtiff4.dll
・DBアクセス
 sqldrivers\qsqlite4.dll

これもファイル名はコンパイラに関係なく同じですが入手元が違います。
配置場所にも注意が必要です。
具体的な配置場所は上記ですでに書いていますが実はこれが忘れがちで配布用のアーカイブ作ったはいいけどダウンロードしてくれた人が使えないとか悲しい事になりますので注意です。

僕もこれでがっつりはまりました。
開発環境の入っているPCだとQtプラグインのDLLがなくても動作する場合があるので必要なDLLはこれでOKかな?と思っていると落とし穴にはまります。
できれば、サブPCやVMとかで開発環境の全く入っていない状態を作っておくと良いかもしれません。

/// 参考 ///
・Qtプラグインの配置先の設定について
 別の手法として「qt.conf」というファイルでQtプラグインの配置場所を指定できます。
 が、使った事無いので参考へのリンクのみで。
  Using qt.conf
・QMLファイルの配置について
 リソースに含めて隠すこともできるようですが現状方法がわかってないので省略しました。
 すみません。