LinuxからWindowsターゲットへのクロスコンパイル用にQtを構成するにはどうすればよいですか?


81

Linux x86_64ホストマシンを使用して、Windows x86_64ターゲット用のQtライブラリ(そして最終的には私のアプリケーション)をクロスコンパイルしたいと思います。私は親密な気がしますが、このプロセスのいくつかの部分について根本的な誤解があるかもしれません。

まず、Fedoraマシンにすべてのmingwパッケージをインストールしてwin32-g++から、環境に合わせてqmake.confファイルを変更しました。ただし、Qt:-platformおよび-xplatform。のいくつかの一見明らかな構成オプションで立ち往生しているようです。Qtのドキュメントには、それ-platformが(コンパイルする)ホストマシンアーキテクチャ-xplatformであり、デプロイするターゲットプラットフォームである必要があると記載されています。私の場合は、Iセット-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

質問:

  1. LinuxホストからWindows用のQtのようなものをクロスコンパイルすると、ネイティブコンパイラは、必要があり、これまでに呼び出されますか?つまり、クロスコンパイルの過程で、クロスコンパイラだけを使うべきではないでしょうか。-xplatformオプションを指定したときに、Qtのconfigureスクリプトがシステムのネイティブコンパイラを呼び出そうとする理由がわかりません。

  2. mingwクロスコンパイラを使用している場合、いつスペックファイルを処理する必要がありますか?GCCのスペックファイルはまだ私には謎のようなものなので、ここでの背景が私に役立つかどうか疑問に思っています。

  3. 一般に、qmake.confでクロスコンパイラを指定する以外に、他に何を考慮する必要がありますか?


2
残りのビルドをブートストラップするには、qmakeのローカルビルドが必要だと思います。のリンクも参照してくださいstackoverflow.com/questions/1025687/の…
Martin Beckett

わかりました、それは理にかなっています。私は今、別の問題を見つけました。ネイティブツールチェーンとクロスツールチェーンが混在しているようです。私のペーストビン出力のエラーx86_64-w64-mingw32-asは、ネイティブのものではなく呼び出しが原因のようです。
シッカダンス氏2012年

2
SOの質問をお気に入りとしてマークすることはめったにありませんが、これはユニークで興味深い質問であり、クールな回答がありました。
jdi 2012

回答:


70

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ジェネレーターツールを実行してから、以下をビルドします。

    $ <mxe root>/usr/i686-pc-mingw32/qt/bin/qmake && make
    
  • バイナリは./releaseディレクトリにあります。

    $ wine release/foo.exe
    

いくつかのメモ

  • MXEリポジトリのマスターブランチを使用します。開発チームからより多くの愛を得ているようです。

  • 出力は32ビットの静的バイナリであり、64ビットのWindowsで適切に機能します。


17
:これらの手順はQt4に適用されます。Qt 5については、stackoverflow.com
a / 14170591

実行する前に$ cd mxe && make qt、要件をインストールする必要があります。Debianシステムの場合、これはを意味しsudo apt-get install autoconf automake autopoint bash bison bzip2 cmake flex gettext git g++ gperf intltool libffi-dev libtool libltdl-dev libssl-dev libxml-parser-perl make openssl patch perl pkg-config python ruby scons sed unzip wget xz-utilsます。その他のシステムについては、mxe.cc
Martin Thoma

16

(これは@Tshepangの回答の更新であり、MXEは彼の回答以降進化してきました)

Qtの構築

むしろ使用するよりもmake qtQtのを構築するためには、使用することができます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


更新していただきありがとうございます。プロジェクトに直接取り組んでいる誰かに応答してもらうのも良いことです。
tshepang 2014

3
これは、新しい回答ではなく、他の回答の編集/更新である必要があります。
WhyNotHugo 2014

3
@Hugo編集ページには次のように書かれています。編集方法:►文法またはスペルの誤りを修正します►変更せずに意味を明確にします►小さな間違いを修正します►関連リソースまたはリンクを追加します►常に元の著者を尊重しますこれはそれらのいずれでもありません。それはTshepangの答えの延長です。
Timothy Gu

「makeqt ....」と入力すると、「ターゲットqtを作成するルールがありません」と応答するだけなので、この答えはわかりません。
鉱山

4

わかりました、私はそれを理解したと思います。

一部は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

そう

  1. はい

  2. msvcrt.dll(デフォルト)以外のものを使用する必要がある場合のみ。私は他に何も使ったことがないので、はっきりとはわかりませんが。

  3. https://stackoverflow.com/a/18792925/32453はいくつかの設定パラメータを一覧表示します。


4

Qtをコンパイルconfigureするには、スクリプトを実行して、ホストプラットフォームをで指定し-platform(たとえば-platform linux-g++-64、g ++コンパイラを使用して64ビットLinuxでビルドしている場合)、ターゲットプラットフォームをで指定する必要があります-xplatform(たとえば-xplatform win32-g++、Windowsにクロスコンパイルする場合)。 )。

このフラグも追加しました: -device-option CROSS_COMPILE=/usr/bin/x86_64-w64-mingw32- は、使用しているツールチェーンのプレフィックスを指定しますこれは、Windowsのバイナリを構築しているすべてのmakefileで「gcc」または「g ++」の前に付加されます。

最後に、icdの構築中に問題が発生する可能性があります。これは、ActiveXサポートをQtに追加するために使用されるようです。フラグ-skip qtactiveqtをconfigureスクリプトに渡すことで、これを回避できます。私はこのバグレポートからこれを持っていますhttps//bugreports.qt.io/browse/QTBUG-38223

これが私が使用した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

あなたの質問について:

1-はい。ビルドプロセスで必要ないくつかのツールをビルドするために、ネイティブコンパイラが呼び出されます。qconfigやqmakeのようなものかもしれませんが、正確にはどのツールかは完全にはわかりません。

2-ごめんなさい。コンパイラのコンテキストでどのスペックファイルがあるのか​​わかりません= /。しかし、私が知る限り、あなたはそれに対処する必要はないでしょう。

3-上記のように、qmake.confファイルで指定する代わりに、configureコマンドラインでクロスコンパイラプレフィックスを指定できます。また、idcにもその問題があり、その回避策についても説明しました。


4

Linux上のWindows用のソフトウェアをクロスコンパイルする別の方法は、Archlinux上のMinGW-w64ツールチェーンです。使用と保守が簡単で、コンパイラの最新バージョンと多くのライブラリを提供します。個人的にはMXEよりも簡単で、新しいバージョンのライブラリをより早く採用しているようです。

まず、アーチベースのマシンが必要になります(仮想マシンまたはDockerコンテナで十分です)。Arch Linuxである必要はなく、派生物も同様です。ManjaroLinuxを使用しました。MinGW-w64パッケージのほとんどは、公式のArchリポジトリでは入手できませんが、AURにはたくさんあります。Arch(Pacman)のデフォルトのパッケージマネージャーはAURからの直接インストールをサポートしていないため、yayやyaourtなどのAURラッパーをインストールして使用する必要があります。次に、MinGW-w64バージョンのQt5およびBoostライブラリのインストールは次のように簡単です。

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

プログラムをデプロイするには、対応するdllをからコピーする必要があります/usr/x86_64-w64-mingw32/bin/。たとえば、通常はにコピー/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つのステップでそれを行うことができました:

  1. Dockerコンテナを起動します。

    sudo docker run -it burningdaylight / mingw-arch:qt / 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を参照してください。


デプロイするには、必要なすべてのQt DLL(またはdoc.qt.io/qt-5/windows-deployment.html)をコピーする必要があります。/mingw64/share/qt5/plugins/platforms/qwindows.dllがplatforms / qwindows.dllにコピーされていることを確認してください。
develCuy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.