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
エラーについても文句を言うことはありません。どうしたの?
コメントを読む前にこれをいじって数日無駄にしたので、答えとして アートレスノイズ のコメントを投稿します:
「arm-linux-gnueabi-gcc -v
でコンパイラを実行し、--with-sysroot
の値を確認します。これは、コンパイラが構築されたディレクトリです。このディレクトリがマシンに存在する場合(おそらく別のコンパイラで)、 --sysrootが機能しない可能性があります[;そして機能する場合not--with-sysroot
を参照し、代わりに--with-libs
を参照してください] gccは--sysroot
サポートなしでコンパイルされます。」