86

Linux x86_64 ホスト マシンを使用して、Windows x86_64 ターゲット用に Qt ライブラリ (および最終的にはアプリケーション) をクロス コンパイルしたいと考えています。近い気がしますが、このプロセスのいくつかの部分について根本的な誤解をしている可能性があります。

まず、すべての mingw パッケージを Fedora マシンにインストールし、win32-g++qmake.conf ファイルを環境に合わせて変更しました。ただし、Qt:-platformおよび-xplatform. Qt のドキュメントによると、これ-platformはホスト マシン アーキテクチャ (コンパイルする場所) であり-xplatform、展開するターゲット プラットフォームである必要があります。私の場合は、変更した win32-g++ 構成を linux-win32-g++ に設定-platform linux-g++-64しました。-xplatform linux-win32-g++

私の問題は、これらのオプションを指定して configure を実行した後、クロス コンパイラ (x86_64-w64-mingw32-gcc) ではなくシステムのコンパイラが呼び出されることです。-xplatformオプションを省略-platformしてターゲット仕様 (linux-win32-g++) に設定すると、クロス コンパイラが呼び出されますが、Unix 関連の関数が定義されていないことが検出されるとエラーが発生します。

これが私の最新の試みからの出力です: http://pastebin.com/QCpKSNev .

質問:

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

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

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

4

5 に答える 5

75

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 リポジトリの master ブランチを使用します。開発チームからより多くの愛を得ているようです。

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

于 2012-11-03T17:57:11.703 に答える
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 用のバイナリをビルドしているすべてのメイクファイルで「gcc」または「g++」の前に追加されます。

最後に、icdのビルド中に問題が発生する可能性があります。これは明らかに、Qt に ActiveX サポートを追加するために使用されるものです。フラグ-skip qtactiveqtを構成スクリプトに渡すことで、これを回避できます。このバグレポートからこれを取得しました: 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 にも問題があり、その回避策についても言及しました。

于 2015-09-03T12:25:53.047 に答える
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には、いくつかの構成パラメーターがリストされています。

于 2013-09-12T23:26:56.940 に答える