WindowsでビルドしたQtの実行ファイルをデプロイする
Qt、好きですか?わたしはすきです。
今回は Windows 上でビルドした Qt をデプロイする方法を書くだけのかんたんな記事です。
こんな人向け
- Windows で Qt をビルドしたこと無い
- ビルドしてできた exe ファイルをエクスプローラーから実行したら「DLL がないよ」みたいなエラーが出てしまった人
- 「アプリケーションを正しく起動できませんでした (0xc000007b)。[OK] をクリックしてアプリケーションを閉じてください。」というエラーに悩まされた人
環境
Windows 10 Home 2004
Qt 5.15.2(D:\Qt にインストール)
ビルド方法は 64 ビット版の MinGW ですが、基本は同じです。一部パスは読み替えてください。
デプロイとは?
「デプロイ」という単語の意味は調べてもらうとして、ここでいうデプロイは「実行ファイルを実行するのに必要な DLL を実行ファイルと同じディレクトリに置く」ことを指します。
Qt Creator なり qmake なりでソフトをビルドした人は、ビルドしたディレクトリに移動して exe ファイルをダブルクリックしてみてください。おそらく「Qt5Core.dll が見つからないため~」などのエラーが出ると思います。出ない環境もあるかもしれませんが、少なくとも Qt をインストールしていない(環境変数を設定してい ない)環境では出ます。
エラーメッセージが示すように、Qt を使用した実行ファイルは、Qt5Core.dll 等の DLL を必要とします。実行ファイルを配布する際には、これらの必要な DLL を同梱する必要があります。
そこで、この「必要な DLL を実行ファイルと同じディレクトリにコピーする」という処理を自動でやってくれるツール、windeployqt.exeを使います。コマンド 1 つで終わるのでとてもらくです。
さっそく使う・・・前に
windeployqt.exe は `Qt\{バージョン}\{ビルドツール}\bin にあります。今回は Qt を D ドライブにインストールしており、かつ 64Bit の MinGW を使用しているため、"D:\Qt\5.15.2\mingw81_64\bin\windeployqt.exe" を使うというわけです。PowerShell なり何なりで、引数に実行ファイルへのパスを渡せば終わりです。
しかし。これをしてしまうと、とある致命的な問題に直面する可能性があります。
それはエラーです。自分のように「windeployqt 使うだけでいいのか~楽だな~」と思って PowerShell からコマンドを叩いた人間は、おそらく「アプリケーションを正しく起動できませんでした (0xc000007b)。[OK] をクリックしてアプリケーションを閉じてください。」 というエラーに悩まされたことでしょう。たぶん。
このエラーを回避するための方法は、「スタートメニューに登録された Qt 用コマンドプロンプトから windeployqt.exe を実行する」 です。こうすることで、Qt の環境変数が登録された状態で実行できます。
実際には Qt 用コマンドプロンプトというより、環境変数を登録するバッチファイルを自動で読み込むように設定したショートカットというだけですけど。
これのどれかです:
コマンドを実行
まずはスタートメニューから任意のコマンドプロンプト
ちなみに、スタートメニューに登録されてないよ~というひとは、普通にコマンドプロンプト(PowerShell だとだめっぽいです)起動し、「 Qt\{バージョン}\{ビルドツール}\bin\qtenv2.bat」(今回の例では D:\Qt\5.15.2\mingw81_64\bin\qtenv2.bat)を実行してください。おそらく同じ環境になると思います。
それでは、以下のようにコマンドを入れていきます。今回は C:\Software\soft.exe を例にします。適宜読み替えてください。
cd /d C:\Software
実行ファイルがある場所に移動します。windeploy.exe soft.exe
ようやく windeploy を使います。- おわり
これだけで終わりです。C:\Software に Qt5Core.dll 等、ファイルが増えていることを確認してください。
おわりに
環境変数、大事ですね。
今回はこの投稿を見て、「環境変数が原因なのでは?」と思い浮かんだのが解決のきっかけでした。
windeployqt 使えばいいよ~という情報はけっこうありますが、Qt のコマンドプロンプトがどうとか、環境変数がどう等の記述は書いてあることが少なかったので、この記事が誰かの役に立てばいいな~と思います。
Comments
Powered by Giscus