ログ日記

作業ログと日記とメモ

Debian busterにmxeをインストールしてQtCreatorで使う

Mastering Qt 5 の Chapter 2 で、いきなり windows.h が要求されて詰まった。ハードル高くない?スルーしてLinuxのコードの部分だけやればいいのかもしれないけど、もやもやする。
そもそもQtを使う人は様々なOSで使いたいわけだから、最初の方のchapterに複数OSの対応を書いておくのが良いということかな。
あまり詳しい説明はないままWindowsLinuxMac用のコードが書いてある。それぞれの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のエラーは、正常に動く場合でも出てる。

仕方がないので普通にWindowsVisual 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 WidgetLinux版もWindows版もDebian上で確認できた。



Macはクロスコンパイルは無理っぽいのであとで実機でやる。