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を例にします。適宜読み替えてください。

  1. cd /d C:\Software
    実行ファイルがある場所に移動します。
  2. windeploy.exe soft.exe
    ようやくwindeployを使います。
  3. おわり

これだけで終わりです。C:\SoftwareにQt5Core.dll等、ファイルが増えていることを確認してください。

おわりに

環境変数、大事ですね。

今回はこの投稿を見て、「環境変数が原因なのでは?」と思い浮かんだのが解決のきっかけでした。

Qt application gives 0xc000007b error
@ouzan said in Qt application gives 0xc000007b error: CoreApplication::setLibraryPaths That is normally not needed unless its very special setup. Please have ...

windeployqt使えばいいよ~という情報はけっこうありますが、Qtのコマンドプロンプトがどうとか、環境変数がどう等の記述は書いてあることが少なかったので、この記事が誰かの役に立てばいいな~と思います。

コメント

タイトルとURLをコピーしました