よもやもダンプ

音楽、サッカー、プログラムなどをだらだらと。

windeployqt.exeでdllをコピーしてきても実行ファイルが動かない

WindowsでQtを勉強し始めて簡単なアプリができたので、とりあえずQt Creatorでreleaseビルドしたあとに生成されたexeファイルを実行しようとした。すると実行に必要なdllが見つからないよと怒られた。

WindowsでQtアプリの配布パッケージを作る(windeployqt.exeを使ってみた) - 理ろぐ

自分で探してくるのも面倒なので何かいいツールがないか探していると、windeployqt.exeというものが既に用意されているのを知った。開発環境はQt5.10.1 & MinGW5.3.0 32bitなのでC:Qt\5.10.1\mingw53_32\binにあったwindeployqt.exeを上のブログのように実行するとdllを自動でコピーしてきてくれた。
これでよし、と思って実行してみると、libwinpthread-1.dllがないよと怒られた。どうもこいつはMinGWサードパーティのライブラリはコピーしてきてくれないらしいので手動でwindeployqt.exeがあったところからdllをコピーした。
すると、今度は「プロシージャ エントリポイント *** がダイナミック リンク ライブラリ xxx から見つかりませんでした。」(xxxはdllだったりexeだったり)と警告された。不勉強なのでどういうことかと調べてみると、これはどうも間違ったdllをコピーしてきてますよ、ということらしい。
libwinpthread-1.dllと同じところからdllをコピーし直してみたけど、同じエラーが出続けた。C:Qt\Tools\QtCreator\binの方のデータをコピーしてきてもエラーが出続けるので、もう自分で必要なdllを全部コピーしようかと思っていたところ、Stack Overflowで自分と同じことを質問してる人がいた。

Cannot run Qt C++ release build. 'The procedure entry point could not be located' - Stack Overflow

ビルドしたexeファイルをC:Qt\5.10.1\mingw53_32\binに移動させて実行すると、問題なく動いた。こりゃwindeployqt.exeが間違ったdllをコピーしてるのが確実なので、windeployqt.exeで自動コピーしたdllを1つずつC:Qt\5.10.1\mingw53_32\binのものに置き換えていった。するとlibstdc++-6.dllを変えた途端アプリが実行できた。
windeployqt.exeについて調べてみると、いくつかdllが間違ってコピーされることがあるようで、信用しすぎるのは良くなさそうだ。