マルチプラットフォームに簡単に開発できる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ファイルの配置について
リソースに含めて隠すこともできるようですが現状方法がわかってないので省略しました。
すみません。
Atsushi4
/// Qtとして必要なDLL ///
のところなのですが,QtGui4.dllはQCoreApplicationを使う場合
(Qtでコンソールアプリケーションを作る場合)は不要ですね。
.proファイルの QT で使用するモジュールを指定するのですが,
デフォルトで core と gui を含むので
コンソールアプリケーションでは
QT -= gui
しているはずです。
あとはQMLアプリケーションでは
qmlapplicationviewer.priで
QT += declarative
しているのでQtDeclarative4.dllが必要だったり,
QTに追加したモジュールに対応するdllが必要になりますね。
自分は QT -= core gui して組込みCプログラム開発にも
Qt Creator使ってたりw