Debian busterにmxeをインストールしてQtCreatorで使う
Mastering Qt 5 の Chapter 2 で、いきなり windows.h が要求されて詰まった。ハードル高くない?スルーしてLinuxのコードの部分だけやればいいのかもしれないけど、もやもやする。
そもそもQtを使う人は様々なOSで使いたいわけだから、最初の方のchapterに複数OSの対応を書いておくのが良いということかな。
あまり詳しい説明はないままWindows、Linux、Mac用のコードが書いてある。それぞれのPCで各自環境構築はやってねということか。OSはあることはあるけど、いちいちソースを移動するのは面倒だよね。それぞれに開発環境を入れないといけないし。
仕方がないのでwindowsバイナリをコンパイルできるように設定する。
まず、mxeを取ってきておもむろにmxeをmakeする。
git clone https://github.com/mxe/mxe.git cd mxe make qt5
missing ... と表示された場合は、足りないものを https://mxe.cc/#requirements を見ながらインストールする。
(aptコマンドをコピペしても良いが、一応一つ一つ確認しながらインストールしたいので)
今の自分の環境だと以下のパッケージが必要だった。
apt install bison flex gperf intltool-bin libtool lzip
あとは
make -j10 MXE_TARGETS='x86_64-w64-mingw32.static' qt5
してしばらく待つ。
結構時間がかかる。(-j オプションと64bitターゲット指定を忘れないように)
# 4/27 追記
身内だけで使うならこれでもいいけど、公開するなら
make -j10 MXE_TARGETS='x86_64-w64-mingw32.shared' qt5
shared の方が良いかも。
まあ配布するなら、配布用バイナリはWindowsでコンパイルする方が良いのかもしれないが。
あと、そもそもqtcreatorをwineで入れる方法があるようだ。
Cross compiling Qt application for Windows on Linux with dynamic linking - Stack Overflow
こっちはちょっと面倒かな。それなら仮想マシンのWindowsにqtcreatorを入れる方が楽な気がする。
# 4/28 追記
mxe で sharedのバイナリは起動できなかった。
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
Unhandled exception: unimplemented function KERNEL32.dll.RaiseFailFastException called in 64-bit code (0x000000007bc5d60c). Register dump:
というエラーが出て、ログには
wine: Call from 0x7bc5d60c to unimplemented function KERNEL32.dll.RaiseFailFastException, aborting wine: Unimplemented function KERNEL32.dll.RaiseFailFastException called at address 0x7bc5d60c (thread 0009), starting debugger...
というエラーが出ている。他にも
0025:err:winediag:xrandr12_init_modes Broken NVIDIA RandR detected, falling back to RandR 1.0. Please consider using the Nouveau driver instead. 002b:fixme:dbghelp:elf_search_auxv can't find symbol in module
のエラーが出ていた。NVIDIAのエラーは、正常に動く場合でも出てる。
仕方がないので普通にWindowsにVisual Studio 2019 と Qt を入れた。
# 追記ここまで
コンパイルが終われば、QtCreatorの「オプション」「Kits」の設定で
コンパイラ
Cコンパイラ:mxe/usr/bin/x86_64-w64-mingw32.static-gcc
C++コンパイラ:mxe/usr/bin/x86_64-w64-mingw32.static-g++
CMake
mxe/usr/bin/x86_64-w64-mingw32.static-cmake
Qtバージョン
mxe/usr/x86_64-w64-mingw32.static/qt5/bin/qmake
キット
上記設定したものを指定
適当にMinGWとでも名前を付けてPATHを手動追加する。
コンパイラのABIは x86 windows msys pe 64bit にする。
chapter 02 をある程度進めて、Windows版はビルドしてから wine64で立ち上げる。
これでいいのかな?とりあえずCPU Widgetは Linux版もWindows版もDebian上で確認できた。