C/C++ ライブラリをクロスコンパイルする必要があります。このライブラリは、いくつかの C/C++ ライブラリに依存しています。ライブラリのそれらのいくつかは、他のライブラリに依存しています。すべてのライブラリには configure スクリプトが付属しています。ライブラリをコンパイルしてホスト システムにインストールする方法を知っています。必要なライブラリの前に依存関係をインストールします。明らかに、これはクロスコンパイル時には機能しません。どんなヒントでも大歓迎です。ありがとうございました。
3 に答える
通常、自動ツール化されたパッケージをクロスコンパイルするには、いくつかの追加の引数を./configure
:--host
および--build
. --host
ビルドされたプログラムが実行される--build
システムの名前であり、コンパイルを行うシステムの名前です。
「システムの名前」と言うときは、形式のタプルを意味しARCH-VENDOR-OS-LIBC
ます。(たとえばi686-pc-linux-gnu
、私が現在使用しているシステムを説明するタプルです。) mingw32 ツールチェーンの場合のように、タプルの一部が省略されることがあります (私のシステムでは、mingw32 クロス ツールがタプルi586-mingw32msvc
および/またはと一緒にインストールされますamd64-mingw32msvc
) 。 .
(configure には別の引数があります--target
。これはコンパイラをクロスコンパイルするためのもので、コードを生成するときにビルド中のコンパイラが対象とするシステムを指定します。)
/usr
各ツールチェーンには、などの下に独自のサブディレクトリがあり/usr/i586-mingw32msvc
ます。新しいパッケージが見つかるように、ここに新しいパッケージをインストールする必要があります。--prefix
への引数を使用しますconfigure
。
したがって、GNU/Linux システムから MinGW32 システムにクロスコンパイルするには、次のconfigure
ように実行します。
./configure --host=i586-mingw32msvc --build=i686-pc-linux-gnu --prefix=/usr/i586-mingw32msvc
したがって、依存関係グラフの葉から始めて、上に向かって進んでください。libtooled パッケージの動的ライブラリの作成を停止--enable-static --disable-shared
する:にも渡すこともできます。configure
パッケージがビルドの一部としてプログラムを実行する必要がある場合、一部のパッケージをネイティブにインストールするだけでなく、クロスコンパイルする必要がある場合があります。
のテストが失敗することconfigure
があります。たとえば、プログラムをコンパイルして実行しようとする場合です。多くの場合、これらのテストはキャッシュ変数を設定し、コマンド ラインで に渡すこともできますconfigure
。同様に、プログラム パスやライブラリのコンパイル/リンク フラグなどをオーバーライドできます。パッケージの./configure --help
.
開発ホストではなくターゲットシステムのヘッダーとライブラリに対してビルドしていることを確認する限り、クロスコンパイルされた共有ライブラリに対してビルドすることにまったく問題はありません。
明らかな依存関係をすべて静的ライブラリとして構築した場合でも、共有CおよびC++言語のランタイムライブラリにリンクしていることに気付くでしょう。また、クロスコンパイルに使用されるヘッダーファイルが、開発ホストではなくターゲットシステムからのものであることを確認する必要があります。
これを行わないと、ほとんどの場合うまくいくでしょう。残りの時間は、デバッグが難しい微妙なクラッシュが発生します。
これをどのように達成するかは、クロスツールチェーンとターゲット環境によって異なります。どちらも言及していないように、開発ホストおよびターゲットとしてのGCCとLinuxのフレーバーだと思いますが、原則は他の開発ホストの使用にも同様に当てはまります。
GCCとbin-utilsのクロスコンパイルディストリビューションは通常、デフォルトのライブラリとヘッダーの検索パスがターゲットシステムのルートファイリングシステムのコピーを指すように構築されています。これは、リンカがリンク先の共有ライブラリを探す場所であり、依存する共有ライブラリが構築されたときにここにインストールします。
--sysroot <mySysRoot>
コマンドラインでオプションをGCCに渡すことにより、GCCのデフォルトのシステムルートをオーバーライドできます。
必要なことは、すべての依存関係の静的ライブラリを作成し、それらを実行可能ファイルに静的にリンクすることです。これらのライブラリを生成するには、クロス コンパイラを使用する必要があります。「mingw static link cross compile」を検索すると、いくつかの良い例を見つけることができます