クロスコンパイラを使用してarm Linux用のFirebirdサーバーをコンパイルしてみました(選択したので正常に動作しました)。
それを使用するとき:
./autogen.sh --host=arm-linux-gnu
次のエラーが発生します。
sem_init() が動作していることを確認してください... 構成: エラー: '/compile/code/firebird/trunk': 構成: エラー: クロスコンパイル時にテストプログラムを実行できません。
私はクロスコンパイルをしていることを知っていますが、Firebird開発者はこれに同意しないかもしれません(しかしFirebirdが他のアーキテクチャ用にコンパイルする準備ができていることを読んでいます)。
答え1
構成はプログラムをコンパイルして実行し、特定の質問に対する答えを決定します。飛行中...(通常)ビルドホストがターゲットホストと同じ場合にこれを実行できます。
クロスコンパイル時に(通常)ビルドシステムは、クロスコンパイラによって生成されたバイナリを実行できません。
この問題を克服するには、設定スクリプトでテスト場所を見つけます。運が良ければ、設定スクリプトはテスト結果をキャッシュすることができます。問題に対する答えなので、バイナリをコンパイルして実行しようとしません。
たとえば、openldap 2.3.11(私が知っている以前のバージョン)をクロスコンパイルしたい場合は、環境に変数を渡す必要があるかもしれませんac_cv_func_memcmp_working=yes
(またはコマンドラインでこの設定を使用して設定を呼び出すことができると思います)。./configure ac_cv_func_memcmp_working=yes --prefix=...
)。 。
構成スクリプトのコードは次のとおりです(以前のバージョンのautoconfなので、最新の構成スクリプトではコードが異なりますが、概念は変更されませんでした)...
echo $ECHO_N "checking for working memcmp... $ECHO_C" >&6
if test "${ac_cv_func_memcmp_working+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
if test "$cross_compiling" = yes; then
ac_cv_func_memcmp_working=no
else
...
上記のコードで、構成スクリプトがクロスコンパイル中であると考えると、ターゲットシステムについて(私の場合は間違っている)仮定をしていることがわかります。
このトリック(回答キャッシュ)を使用して問題を解決できない場合は、別の方法で回避策を提供する必要があります...目標は、構成スクリプトがまったく実行されるように欺くことです。