Linux x86_64ホストマシンを使用して、Windows x86_64ターゲット用のQtライブラリ(最終的にはアプリケーション)をクロスコンパイルしたいと思います。私は近いと感じていますが、このプロセスの一部について根本的な誤解があるかもしれません。
Fedoraマシンにすべてのmingwパッケージをインストールし、win32-g++
qmake.confファイルを環境に合わせて変更することから始めました。ただし、Qtの構成オプションとして-platform
と-xplatform
のように見えるものがいくつかあるように見えます。 Qtのドキュメントには、-platform
がホストマシンアーキテクチャ(コンパイルする場所)であり、-xplatform
がデプロイ対象のターゲットプラットフォームであることが記載されています。私の場合、-platform linux-g++-64
と-xplatform linux-win32-g++
を設定します。ここで、linux-win32-g ++は変更されたwin32-g ++構成です。
私の問題は、これらのオプションを使用してconfigureを実行した後、クロスコンパイラ(x86_64-w64-mingw32-gcc)ではなくシステムのコンパイラを起動することです。 -xplatform
オプションを省略し、-platform
をターゲット仕様(linux-win32-g ++)に設定すると、クロスコンパイラが起動されますが、Unix関連の関数が定義されていないことが検出されるとエラーになります。
これが私の最新の試みの出力です: http://Pastebin.com/QCpKSNev 。
質問:
LinuxホストからQt for Windowsのようなものをクロスコンパイルする場合、ネイティブコンパイラeverを呼び出す必要がありますか?つまり、クロスコンパイルプロセス中に、onlyクロスコンパイラを使用すべきではありませんか? -xplatform
オプションを指定したときにQtのconfigureスクリプトがシステムのネイティブコンパイラを呼び出そうとする理由がわかりません。
Mingwクロスコンパイラを使用している場合、specファイルをいつ処理する必要がありますか? GCCの仕様ファイルはまだ謎のようなものですので、ここでの背景が私を助けてくれるのではないかと思っています。
一般に、qmake.confでクロスコンパイラを指定する以外に、他に何を考慮する必要がありますか?
Mクロス環境(MXE) を使用するだけです。プロセス全体の痛みを取り除きます。
それを得る:
$ git clone https://github.com/mxe/mxe.git
インストール ビルドの依存関係
Qt for Windows、その依存関係、およびクロスビルドツールをビルドします。適切なインターネットアクセスが可能な高速マシンでは、これには約1時間かかります。ダウンロードは約500MBです:
$ cd mxe && make qt
アプリのディレクトリに移動し、クロスビルドツールを[〜#〜] path [〜#〜]環境変数に追加します。
$ export PATH=<mxe root>/usr/bin:$PATH
Qt Makefile Generatorツールを実行してからビルドします。
$ <mxe root>/usr/i686-pc-mingw32/qt/bin/qmake && make
バイナリは./releaseディレクトリにあります。
$ wine release/foo.exe
注意事項:
MXEリポジトリのmasterブランチを使用してください。開発チームからより多くの愛を得るようです。
出力は32ビットの静的バイナリであり、64ビットのWindowsで適切に機能します。
(これは@Tshepangの答えの更新です。MXEは彼の答えから進化しています)
make qt
を使用してQtを構築する代わりに、MXE_TARGETS
を使用してターゲットマシンとツールチェーン(32ビットまたは64ビット)を制御できます。 MXEは、ターゲット名の一部として.static
および.shared
の使用を開始し、ビルドするlibのタイプを示します。
# 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
になりました
わかりました。わかったと思います。
https://github.com/mxe/mxe/blob/master/src/qt.mk および https://www.videolan.org/developers/vlcに一部基づいています/contrib/src/qt4/rules.mak
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/3245 はいくつかの設定パラメータをリストします。
Qtをコンパイルするには、configure
スクリプトを実行し、-platform
でホストプラットフォームを指定する必要があります(たとえば、g ++コンパイラを使用して64ビットLinuxでビルドする場合は-platform linux-g++-64
)および-xplatform
を含むターゲットプラットフォーム(たとえば、ウィンドウにクロスコンパイルする場合は-xplatform win32-g++
)。
また、このフラグを追加しました:-device-option CROSS_COMPILE=/usr/bin/x86_64-w64-mingw32-
は、使用しているツールチェーンのプレフィックスを指定します。これは、Windows用のバイナリを構築しているすべてのメイクファイルで 'gcc'または 'g ++'の先頭に追加されます。
最後に、 icd の構築中に問題が発生する可能性があります。これは、QtにActiveXサポートを追加するために使用されているようです。フラグ-skip qtactiveqt
をconfigureスクリプトに渡すことでそれを回避できます。このバグレポートからこれを入手しました。 https://bugreports.qt.io/browse/QTBUG-3822
私が使用したconfigureコマンド全体を以下に示します。
cd qt_source_directory
mkdir my_build
cd my_build
../configure \
-release \
-opensource \
-no-compile-examples \
-platform linux-g++-64 \
-xplatform win32-g++ \
-device-option CROSS_COMPILE=/usr/bin/x86_64-w64-mingw32- \
-skip qtactiveqt \
-v
Youtの質問に関して:
1-はい。ネイティブコンパイラは、ビルドプロセスで必要ないくつかのツールをビルドするために呼び出されます。 qconfigやqmakeのようなものかもしれませんが、どのツールか、正確にはわかりません。
2-ごめんなさい。コンパイラのコンテキストでspecsファイルが何であるかわからない= /。しかし、私が知る限り、あなたはそれに対処する必要はありません。
3-上記のように、qmake.confファイルではなく、configureコマンドラインでクロスコンパイラプレフィックスを指定できます。また、idcにもその問題があります。idcの回避策についても述べました。
Linux上のWindows用のソフトウェアをクロスコンパイルする別の方法は、Archlinux上のmingw-w64ツールチェーンです。使用と保守が簡単で、最新バージョンのコンパイラと多くのライブラリを提供します。個人的にはMXEよりも簡単で、新しいバージョンのライブラリをより早く採用できるようです。
最初にArchベースのマシンが必要になります(仮想マシンまたはdockerコンテナで十分です)。 Arch Linuxである必要はなく、派生物も同様です。 Manjaro Linuxを使用しました。ほとんどのmingw-w64パッケージは公式のArchリポジトリでは利用できませんが、 AURにはたくさん があります。 Arch(pacman)のデフォルトパッケージマネージャーはAURからの直接インストールをサポートしていないため、pacaurやyaourtなどのAURラッパーをインストールして使用する必要があります。 Qt5およびBoostライブラリのmingw-w64バージョンのインストールは次のように簡単です:
pacaur -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をコピーする必要があります。
32ビットバージョンを取得するには、代わりにi686-w64-mingw32-qmake-qt5
を使用するだけです。 Cmakeベースのプロジェクトは、x86_64-w64-mingw32-cmake
と同じように簡単に機能します。このアプローチは私にとって非常にうまく機能し、セットアップ、保守、拡張が最も簡単でした。また、継続的な統合サービスにも適しています。 docker images も利用可能です。
たとえば、QNapi字幕ダウンローダーGUIを構築したいとします。私は2つのステップでそれを行うことができました:
1)Dockerコンテナーを開始します。
Sudo docker run -it burningdaylight/docker-mingw-qt5 /bin/bash
2)QNapiのクローンとコンパイル
git clone --recursive 'https://github.com/QNapi/qnapi.git'
cd qnapi/
x86_64-w64-mingw32-qmake-qt5
make
それでおしまい!多くの場合、それは簡単です。独自のライブラリをパッケージリポジトリ(AUR)に追加するのも簡単です。 PKBUILDファイルを書き込む が必要です。これは、可能な限り直感的です。たとえば、 mingw-w64-rapidjson を参照してください。