web-dev-qa-db-ja.com

クロスコンパイル:GCCは--sysrootを無視します

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

古い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

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

12
trololo

コメントを読む前にこれをいじって数日無駄にしたので、答えとして アートレスノイズ のコメントを投稿します:

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

4
jcomeau_ictx