16

Linux Mint の 64 ビット リポジトリの arm-linux-gnueabi-gcc を使用して、Nokia N9 電話用のプログラム (現在は libav の avconv) をクロス コンパイルしようとしています。コンパイラの libc バージョンは 2.15 で、電話には libc-2.10.1 があります。数学ライブラリには非互換性があり、libav から avconv プログラムをコンパイルして実行すると、segfault が発生します。

古いバージョンの libc に対してコンパイルおよびリンクする必要がありますが、--sysrootオプションを機能させることができませんでした。

libav の構成とコンパイルを繰り返すのを避けるために、小さなテスト プログラムを作成しました。

arm-linux-gnueabi-gcc --sysroot=/opt/CrossCompilation/NokiaN9/ -o output.sysroot hello.c
arm-linux-gnueabi-gcc -o output.nosysroot hello.c

どちらのコマンドも同じ出力ファイルを作成します。これはhello.c次のようになります。

#include <stdio.h>
#include <math.h>

int main() {
    printf("Hello, World! Sin = %f\n", sin(0.6451));
}

最も奇妙な部分は、gcc が--sysrootオプションを完全に無視することです。存在しないディレクトリを sysroot に渡すと、まったく同じ出力バイナリが生成されます。

arm-linux-gnueabi-gcc --sysroot=/foo/bar -o output.foobar hello.c

エラーについても文句を言いません。どうしたの?

4

1 に答える 1

8

コメントを読む前にこれをいじって数日無駄にしたので、artless noiseのコメントを回答として投稿します。

「でコンパイラを実行arm-linux-gnueabi-gcc -vし、の値を見てください--with-sysroot。これは、コンパイラが構築されたディレクトリです。このディレクトリがマシンに存在する場合(おそらく別のコンパイラを使用している場合)、 --sysroot は機能しない可能性があります[;そしてが表示され--with-sysroot、代わりに表示される場合--with-libsは、gcc が--sysrootサポートなしでコンパイルされていることを意味します。」

于 2016-05-26T15:15:43.720 に答える