Linux で Windows 用のソフトウェアをクロスコンパイルするもう 1 つの方法は、Archlinux の MinGW-w64 ツールチェーンです。使用と保守が簡単で、最新バージョンのコンパイラーと多くのライブラリーを提供します。個人的には MXE よりも簡単で、新しいバージョンのライブラリをより早く採用できるようです。
まず、arch ベースのマシンが必要です (仮想マシンまたは Docker コンテナーで十分です)。 Arch Linux である必要はありません。派生物でも同様です。私は Manjaro Linux を使用しました。MinGW-w64 パッケージのほとんどは、公式の Arch リポジトリでは入手できませんが、AUR にはたくさんあります。 Arch (Pacman) のデフォルトのパッケージ マネージャーは、AUR からの直接のインストールをサポートしていないため、yay や yaourt などの AUR ラッパーをインストールして使用する必要があります。その後、Qt5 と Boost ライブラリの MinGW-w64 バージョンをインストールするのは簡単です:
yay -Sy mingw-w64-qt5-base mingw-w64-boost
#yaourt -Sy mingw-w64-qt5-base mingw-w64-qt5-boost #if you use yaourt
これにより、MinGW-w64 ツールチェーン (mingw-w64-gcc
) もインストールされます。 ) およびその他の依存関係。Windows (x64) 用の Qt プロジェクトのクロスコンパイルは次のように簡単です:
x86_64-w64-mingw32-qmake-qt5
make
プログラムをデプロイするには、/usr/x86_64-w64-mingw32/bin/
から対応する dll をコピーする必要があります。 .たとえば、通常は /usr/x86_64-w64-mingw32/lib/qt/plugins/platforms/qwindows.dll
をコピーする必要があります program.exe_dir/platforms/qwindows.dll
まで .
32 ビット バージョンを取得するには、i686-w64-mingw32-qmake-qt5
を使用するだけです。 代わりは。 Cmake ベースのプロジェクトは x86_64-w64-mingw32-cmake
で簡単に動作します このアプローチは私にとって非常にうまく機能し、セットアップ、保守、および拡張が最も簡単でした。また、継続的な統合サービスにも適しています。利用可能な docker イメージもあります。
たとえば、QNapi 字幕ダウンローダー GUI を構築したいとします。 2 つのステップでそれを行うことができます:
<オール>sudo docker run -it burningdaylight/mingw-arch:qt /bin/bash
- QNapi のクローンとコンパイル
git clone --recursive 'https://github.com/QNapi/qnapi.git'
cd qnapi/
x86_64-w64-mingw32-qmake-qt5
make
それでおしまい!多くの場合、それは簡単です。独自のライブラリをパッケージ リポジトリ (AUR) に追加するのも簡単です。可能な限り直感的な PKBUILD ファイルを作成する必要があります。たとえば、mingw-w64-rapidjson を参照してください。
(MXE は彼の回答から進化したため、これは @Tshepang の回答の更新です)
Qt のビルド
make qt
を使用するのではなく Qt をビルドするには、MXE_TARGETS
を使用できます ターゲット マシンとツールチェーン (32 ビットまたは 64 ビット) を制御します。 MXE は .static
を使用して開始しました および .shared
ビルドするライブラリのタイプを示すターゲット名の一部として。
# The following is the same as `make qt`, see explanation on default settings after the code block.
make qt MXE_TARGETS=i686-w64-mingw32.static # MinGW-w64, 32-bit, static libs
# Other targets you can use:
make qt MXE_TARGETS=x86_64-w64-mingw32.static # MinGW-w64, 64-bit, static libs
make qt MXE_TARGETS=i686-w64-mingw32.shared # MinGW-w64, 32-bit, shared libs
# You can even specify two targets, and they are built in one run:
# (And that's why it is MXE_TARGET**S**, not MXE_TARGET ;)
# MinGW-w64, both 32- and 64-bit, static libs
make qt MXE_TARGETS='i686-w64-mingw32.static x86_64-w64-mingw32.static'
@Tshepang の元の回答では、MXE_TARGETS
を指定していませんでした。 であり、デフォルトが使用されます。彼が回答を書いた時点で、デフォルトは i686-pc-mingw32
でした 、今は i686-w64-mingw32.static
です . MXE_TARGETS
を明示的に設定した場合 i686-w64-mingw32
へ 、 .static
を省略 、この構文は現在非推奨であるため、警告が出力されます。ターゲットを i686-pc-mingw32
に設定しようとすると 、MXE が MinGW.org (i686-pc-mingw32) のサポートを削除したため、エラーが表示されます。
qmake
を実行中
MXE_TARGETS
を変更したため 、<mxe root>/usr/i686-pc-mingw32/qt/bin/qmake
コマンドが機能しなくなります。今、あなたがする必要があるのは:
<mxe root>/usr/<TARGET>/qt/bin/qmake
MXE_TARGETS
を指定しなかった場合 、これを行います:
<mxe root>/usr/i686-w64-mingw32.static/qt/bin/qmake
更新: 新しいデフォルトは i686-w64-mingw32.static
になりました
M クロス環境 (MXE) を使用するだけです。プロセス全体から苦痛を取り除きます:
-
入手:
$ git clone https://github.com/mxe/mxe.git
-
ビルドの依存関係をインストールする
-
Windows 用の Qt、その依存関係、およびクロスビルド ツールをビルドします。これには、適切なインターネット アクセスが可能な高速マシンで約 1 時間かかります。ダウンロードは約 500 MB です。
$ cd mxe && make qt
-
アプリのディレクトリに移動し、クロスビルド ツールを PATH に追加します。 環境変数:
$ export PATH=<mxe root>/usr/bin:$PATH
-
Qt Makefile ジェネレーター ツールを実行してビルドします。
$ <mxe root>/usr/i686-pc-mingw32/qt/bin/qmake && make
-
バイナリは ./release ディレクトリにあります:
$ wine release/foo.exe
注意事項 :
-
MXE リポジトリのマスター ブランチを使用します。開発チームからより多くの愛を得ているようです.
-
出力は 32 ビットの静的バイナリで、64 ビット Windows で適切に動作します。
わかりました。理解できたと思います。
一部は https://github.com/mxe/mxe/blob/master/src/qt.mk および https://www.videolan.org/developers/vlc/contrib/src/qt4/rules.mak<に基づく/P>
configure を (-xtarget などを使用して) 実行すると、「最初に」、構成してから「hosts」gcc を実行して、ローカル バイナリ ファイル ./bin/qmake を作成するように見えます
./configure -xplatform win32-g++ -device-option CROSS_COMPILE=$cross_prefix_here -nomake examples ...
次に、通常の「make」を実行すると、mingw 用にビルドされます
make
make install
そう
<オール>はい
msvcrt.dll (デフォルト) 以外のものを使用する必要がある場合のみ。他のものを使ったことがないので、確かなことはわかりません.
https://stackoverflow.com/a/18792925/32453 には、いくつかの構成パラメーターがリストされています。