web-dev-qa-db-ja.com

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

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

質問:

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

  2. Mingwクロスコンパイラを使用している場合、specファイルをいつ処理する必要がありますか? GCCの仕様ファイルはまだ謎のようなものですので、ここでの背景が私を助けてくれるのではないかと思っています。

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

76
Mr. Shickadance

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で適切に機能します。

62
Tshepang

(これは@Tshepangの答えの更新です。MXEは彼の答えから進化しています)

Qtの構築

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になりました

16
Timothy Gu

わかりました。わかったと思います。

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/3245 はいくつかの設定パラメータをリストします。

4
rogerdpack

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の回避策についても述べました。

3
user986730

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 を参照してください。

1
Mykola Dimura