配布用に必要なファイルを探しましょう
Windows用フリーソフトウェアとして配布するのに必要なファイルを以前調べました。
実行ファイルであるexeファイルの他にQt5が提供しているダイナミックリンクライブラリ(DLL)を同梱するか、それらをすべてくっつけた大きな実行ファイル(スタティックリンクしたもの)を作って提供するかを選ぶ必要があります。
以前は、必要なファイルをくっつけた巨大な実行ファイルを作ろう、という話をしていましたが、やっぱりダイナミックリンクライブラリを同梱した方がいいかなという気になりました。
配布に使う実行ファイルはデバッグ用の実行ファイルではなく、リリース用に作った実行ファイルでなくてはなりません。MinGW版だとreleaseフォルダの下に出来上がるexeファイルです。
mingw32-make release
とすれば出来上がります。普段のデバッグ用には
mingw32-make debug
です。デバッグ用の実行ファイルサイズは2439167バイト(約2.4MB)もありますが、リリース用実行ファイルサイズは193536バイト(189KB)です。
さて、Qt5.3が提供するDLLも一緒に提供しなくてはなりません。cygwinのlddコマンドを使います。
ldd release/qtbrynhildr.exe
と実行すると、一瞬スラッシュウィンドウが表示されますが、すぐ実行は終わります。どうやら、実際にリンク作業させるために、実行されるようです。ウィンドウが閉じた後、結果が表示されます。
ldd release/qtbrynhildr.exe >& ldd.log
とすればldd.logというファイルに結果を保存できるます。
ldd.logの内容は以下のようになりました。
ntdll.dll => /c/Windows/SYSTEM32/ntdll.dll (0x7ff8de7f0000)
ntdll.dll => /c/Windows/SYSTEM32/ntdll.dll (0x77460000)
wow64.dll => /c/Windows/SYSTEM32/wow64.dll (0x773a0000)
wow64win.dll => /c/Windows/system32/wow64win.dll (0x773f0000)
wow64cpu.dll => /c/Windows/system32/wow64cpu.dll (0x77390000)
OPENGL32.DLL => /c/Windows/SYSTEM32/OPENGL32.DLL (0x4c0000)
KERNEL32.DLL => /c/Windows/SYSTEM32/KERNEL32.DLL (0x770e0000)
OPENGL32.DLL => /c/Windows/SYSTEM32/OPENGL32.DLL (0x4c0000)
OPENGL32.DLL => /c/Windows/SYSTEM32/OPENGL32.DLL (0x4c0000)
KERNEL32.DLL => /c/Windows/SYSTEM32/KERNEL32.DLL (0x770e0000)
KERNELBASE.dll => /c/Windows/SYSTEM32/KERNELBASE.dll (0x77010000)
msvcrt.dll => /c/Windows/SYSTEM32/msvcrt.dll (0x76f40000)
libgcc_s_dw2-1.dll => /c/Tools/develop/Qt/Qt5.3.0/5.3/mingw482_32/bin/libgcc_s_dw2-1.dll (0x6e940000)
libstdc++-6.dll => /c/Tools/develop/Qt/Qt5.3.0/5.3/mingw482_32/bin/libstdc++-6.dll (0x6fc40000)
Qt5Core.dll => /c/Tools/develop/Qt/Qt5.3.0/5.3/mingw482_32/bin/Qt5Core.dll (0x68880000)
Qt5Gui.dll => /c/Tools/develop/Qt/Qt5.3.0/5.3/mingw482_32/bin/Qt5Gui.dll (0x61940000)
Qt5Multimedia.dll => /c/Tools/develop/Qt/Qt5.3.0/5.3/mingw482_32/bin/Qt5Multimedia.dll (0x6b480000)
Qt5Network.dll => /c/Tools/develop/Qt/Qt5.3.0/5.3/mingw482_32/bin/Qt5Network.dll (0x69700000)
Qt5Widgets.dll => /c/Tools/develop/Qt/Qt5.3.0/5.3/mingw482_32/bin/Qt5Widgets.dll (0x61dc0000)
libwinpthread-1.dll => /c/Tools/develop/Qt/Qt5.3.0/5.3/mingw482_32/bin/libwinpthread-1.dll (0x64940000)
USER32.dll => /c/Windows/SYSTEM32/USER32.dll (0x75050000)
ADVAPI32.dll => /c/Windows/SYSTEM32/ADVAPI32.dll (0x75c20000)
ole32.dll => /c/Windows/SYSTEM32/ole32.dll (0x75870000)
SHELL32.dll => /c/Windows/SYSTEM32/SHELL32.dll (0x75d80000)
WS2_32.dll => /c/Windows/SYSTEM32/WS2_32.dll (0x75d30000)
icuin52.dll => /c/Tools/develop/Qt/Qt5.3.0/5.3/mingw482_32/bin/icuin52.dll (0x69e00000)
icuuc52.dll => /c/Tools/develop/Qt/Qt5.3.0/5.3/mingw482_32/bin/icuuc52.dll (0x66480000)
GDI32.dll => /c/Windows/SYSTEM32/GDI32.dll (0x75490000)
OPENGL32.DLL => /c/Windows/SYSTEM32/OPENGL32.DLL (0x4c0000)
CRYPT32.dll => /c/Windows/SYSTEM32/CRYPT32.dll (0x756f0000)
DNSAPI.DLL => /c/Windows/SYSTEM32/DNSAPI.DLL (0x717f0000)
sechost.dll => /c/Windows/SYSTEM32/sechost.dll (0x75cf0000)
RPCRT4.dll => /c/Windows/SYSTEM32/RPCRT4.dll (0x75350000)
combase.dll => /c/Windows/SYSTEM32/combase.dll (0x755a0000)
SHLWAPI.dll => /c/Windows/SYSTEM32/SHLWAPI.dll (0x75ca0000)
NSI.dll => /c/Windows/SYSTEM32/NSI.dll (0x752b0000)
icudt52.dll => /c/Tools/develop/Qt/Qt5.3.0/5.3/mingw482_32/bin/icudt52.dll (0x6bbc0000)
GLU32.dll => /c/Windows/SYSTEM32/GLU32.dll (0x50350000)
DDRAW.dll => /c/Windows/SYSTEM32/DDRAW.dll (0x64aa0000)
MSASN1.dll => /c/Windows/SYSTEM32/MSASN1.dll (0x75420000)
SspiCli.dll => /c/Windows/SYSTEM32/SspiCli.dll (0x74e80000)
DCIMAN32.dll => /c/Windows/SYSTEM32/DCIMAN32.dll (0x67430000)
CRYPTBASE.dll => /c/Windows/SYSTEM32/CRYPTBASE.dll (0x74e70000)
bcryptPrimitives.dll => /c/Windows/SYSTEM32/bcryptPrimitives.dll (0x74e10000)
IMM32.DLL => /c/Windows/system32/IMM32.DLL (0x75bf0000)
MSCTF.dll => /c/Windows/SYSTEM32/MSCTF.dll (0x75af0000)
SHCORE.dll => /c/Windows/SYSTEM32/SHCORE.dll (0x74bb0000)
profapi.dll => /c/Windows/SYSTEM32/profapi.dll (0x74c70000)
qwindows.dll => /c/Tools/develop/Qt/Qt5.3.0/5.3/mingw482_32/plugins/platforms/qwindows.dll (0x6a880000)
OLEAUT32.dll => /c/Windows/SYSTEM32/OLEAUT32.dll (0x751e0000)
WINMM.DLL => /c/Windows/SYSTEM32/WINMM.DLL (0x74d80000)
WINMMBASE.dll => /c/Windows/SYSTEM32/WINMMBASE.dll (0x74c50000)
cfgmgr32.dll => /c/Windows/SYSTEM32/cfgmgr32.dll (0x75270000)
DEVOBJ.dll => /c/Windows/SYSTEM32/DEVOBJ.dll (0x74c30000)
kernel.appcore.dll => /c/Windows/SYSTEM32/kernel.appcore.dll (0x74ba0000)
uxtheme.dll => /c/Windows/system32/uxtheme.dll (0x71ff0000)
dwmapi.dll => /c/Windows/system32/dwmapi.dll (0x360000)
qjpeg.dll => /c/Tools/develop/Qt/Qt5.3.0/5.3/mingw482_32/plugins/imageformats/qjpeg.dll (0x626c0000)
CRYPTSP.dll => /c/Windows/SYSTEM32/CRYPTSP.dll (0x72120000)
rsaenh.dll => /c/Windows/system32/rsaenh.dll (0x720f0000)
bcrypt.dll => /c/Windows/SYSTEM32/bcrypt.dll (0x720d0000)
Windowsが提供するDLLは必要ないので以下のようにして選別します。
grep -v Windows ldd.log > ldd_Qt.log
Qt関係(正確にはWindowsが提供するDLL以外)の情報だけがldd_Qt.logに入ります。
libgcc_s_dw2-1.dll => /c/Tools/develop/Qt/Qt5.3.0/5.3/mingw482_32/bin/libgcc_s_dw2-1.dll (0x6e940000)
libstdc++-6.dll => /c/Tools/develop/Qt/Qt5.3.0/5.3/mingw482_32/bin/libstdc++-6.dll (0x6fc40000)
Qt5Core.dll => /c/Tools/develop/Qt/Qt5.3.0/5.3/mingw482_32/bin/Qt5Core.dll (0x68880000)
Qt5Gui.dll => /c/Tools/develop/Qt/Qt5.3.0/5.3/mingw482_32/bin/Qt5Gui.dll (0x61940000)
Qt5Multimedia.dll => /c/Tools/develop/Qt/Qt5.3.0/5.3/mingw482_32/bin/Qt5Multimedia.dll (0x6b480000)
Qt5Network.dll => /c/Tools/develop/Qt/Qt5.3.0/5.3/mingw482_32/bin/Qt5Network.dll (0x69700000)
Qt5Widgets.dll => /c/Tools/develop/Qt/Qt5.3.0/5.3/mingw482_32/bin/Qt5Widgets.dll (0x61dc0000)
libwinpthread-1.dll => /c/Tools/develop/Qt/Qt5.3.0/5.3/mingw482_32/bin/libwinpthread-1.dll (0x64940000)
icuin52.dll => /c/Tools/develop/Qt/Qt5.3.0/5.3/mingw482_32/bin/icuin52.dll (0x69e00000)
icuuc52.dll => /c/Tools/develop/Qt/Qt5.3.0/5.3/mingw482_32/bin/icuuc52.dll (0x66480000)
icudt52.dll => /c/Tools/develop/Qt/Qt5.3.0/5.3/mingw482_32/bin/icudt52.dll (0x6bbc0000)
qwindows.dll => /c/Tools/develop/Qt/Qt5.3.0/5.3/mingw482_32/plugins/platforms/qwindows.dll (0x6a880000)
qjpeg.dll => /c/Tools/develop/Qt/Qt5.3.0/5.3/mingw482_32/plugins/imageformats/qjpeg.dll (0x626c0000)
上記に現れたDLLファイルを実行ファイルと同梱すればいいことになります。どこにあるかは、上の情報をみれば分かりますね。今のところ、最終的には以下の14個のファイルを実行ファイルと同じ所に置いておけばいいことになりそうです。
libgcc_s_dw2-1.dll
libstdc++-6.dll
Qt5Core.dll
Qt5Gui.dll
Qt5Multimedia.dll
Qt5Network.dll
Qt5Widgets.dll
libwinpthread-1.dll
icuin52.dll
icuuc52.dll
icudt52.dll
qwindows.dll
qjpeg.dll
今後新たな機能を追加すると新たなDLLを追加する必要が出てきますが、同じように調べればその時点で必要なファイルは調べられます。ただし、多言語対応しようとすると特別なファイルが必要になるのかもしれません、が今のところ日本語対応していないので、必要なさそうです。それについてはまた調べます。
Linuxでの調べ方も基本的には同じですが、実行用にQtが提供するライブラリ類は別途パッケージとして提供されるのが普通のようなので、そこは別途確認が必要です。
(追記)
「Visual C++ 2010 x86 Redistributable」パッケージも必要かしれません(すでにPCに入っている可能性もあります)。この配布ファイルは、Qtのパッケージに含まれています。具体的にはQt\Qt5.3.0\vcredistの下にある
vcredist_sp1_x86.exe
を同梱すれば良さそうです。
(追記2)
Microsoft のツールである Dependency Walker を使っても同様の情報は得られますが、使っているすべてのプラグインの情報は得られないこともあります。動作しない機能がある場合は地道に必要なプラグインを探すか、すべてのdllを同梱する、ということになりそうです。例えば、qtaudio_windows.dll とか。
« 進捗記録 2014.5.21 | トップページ | 多言語対応の準備をしましょうかね その1 »
コメント