web-dev-qa-db-ja.com

クロスコンパイル中にテストプログラムを実行できません-クロスコンパイルFirebird

クロスコンパイラを使用して、arm linux用のfirebirdサーバーをコンパイルしようとしました(選択されています-正しく動作しています)。

使用する場合:

./autogen.sh --Host = arm-linux-gnu

このエラーが発生します:

動作中のsem_init()をチェックしています... configure:エラー: `/ compile/code/firebird/trunk '内:configure:エラー:クロスコンパイル中にテストプログラムを実行できません

私はクロスコンパイルしていることを知っていますが、Firebirdの開発者はこれを嫌っているかもしれません(しかし、Firebirdは別のアーキテクチャ用にコンパイルする準備ができていることを読みました)。

2
Sławomir Kozok

Configureは、プログラムをコンパイルして実行することにより、特定の質問に対する答えを決定しますオンザフライ ...ビルドホストがターゲットホストと同じ場合に(通常)実行できます。

クロスコンパイルしているとき、(通常)ビルドマシンはクロスコンパイラーによって生成されたバイナリーを実行できません。

これを克服するには、configureスクリプトのどこにテストがあるかを見つけます。運が良ければ、configureスクリプトを使用すると、テスト結果をキャッシュできます。これを使用して、configureスクリプトをだましてすでにだと思わせることができます。質問に対する答えを知っているので、バイナリをコンパイルして実行しようとはしません。

たとえば、openldap 2.3.11(古いバージョン、私は知っています)をクロスコンパイルしようとした場合、環境に変数ac_cv_func_memcmp_working=yesを渡す必要があるかもしれません(または、この設定でconfigureを呼び出すことができると思います)コマンドライン(例:./configure ac_cv_func_memcmp_working=yes --prefix=...)。

Configureスクリプトのコードは次のようになります(これはautoconfの古いバージョンであるため、新しいconfigureスクリプトではコードが異なりますが、概念は変更されていません)...

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
...

上記のコードを見ると、クロスコンパイルしていると思われる場合、configureスクリプトがターゲットマシンについて(私の場合は正しくない)仮定をしていることがわかります。

このトリック(キャッシュされた回答)を使用して回避できない場合は、他の方法で回避策を提供する必要があります...目標は、configureスクリプトをだまして最後まで実行することです。

3
Murray Jensen