web-dev-qa-db-ja.com

Autoconfを使用したARMのクロスコンパイル

Autconfを使用して私の腕のボードのライブラリをクロスコンパイルするのに問題があります。

私はこの行を使用しています:

./configure --target=arm-linux --Host=arm-linux --prefix=/bla/bla/bla/linux_arm_tool CFLAGS='-m32'
make
make install

fileを実行して確認すると、次のようになります。

libjpeg.so.8.4.0: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, not stripped

それはまったく正しくないようですが、とにかくそれを使ってみました...そして私は得ます:

/usr/lib/gcc/arm-linux-gnueabi/4.5.3/../../../../arm-linux-gnueabi/bin/ld: skipping incompatible /bla/bla/bla/bla/../linux_arm_tool/lib/libjpeg.so when searching for -ljpeg

私は途方に暮れています、私は1時間グーグルで過ごしています...

11
Constantin

したがって、本当に基本的なメソッド呼び出しを使用する前にクロスコンパイルしたことを知っていて、出力を調べた後、なぜこれを回避したのかを理解しました。

checking for arm-linux-gnueabi-gcc... no
checking for gcc... gcc
...
...
checking for arm-linux-gnueabi-gcc... gcc

私の/usr/binありませんでしたarm-linux-gnueabi-gcc、 そうしなければならなかった:

ln -s /usr/bin/arm-linux-gnueabi-gcc-4.5 /usr/bin/arm-linux-gnueabi-gcc

私は正常にクロスコンパイルしました:

./configure --Host=arm-linux-gnueabi -prefix=${CSTOOL_DIR}/linux_arm_tool

リンクについては...いくつかのことを確認する必要がありますが、いくつかの-rpath-linkより高度なコンパイルのフラグ。

15
Constantin

問題は、より一般的には「Autoconfを使用してARMのクロスコンパイルを行うにはどうすればよいですか」と言い換えることができると思います。

./configure -hによると:

System types:
  --build=BUILD     configure for building on BUILD [guessed]
  --Host=HOST       cross-compile to build programs to run on Host [BUILD]

公式のGNUドキュメントはこの質問に答えるのに役立ちます:

http://www.gnu.org/software/autoconf/manual/autoconf-2.67/html_node/Hosts-and-Cross_002dCompilation.html

--Host--buildの使用法を定義するときに注意してください。

Therefore, whenever you specify --Host, be sure to specify --build too.

そして、ここに、組み込みのARMプラットフォーム用にiperfを構成するために使用した例を示します。

まず最初に、「./ configure」スクリプトは実際には「Autoconf」と呼ばれ、グーグルの助けになります。ここでの考え方は:

  • 現在の$ PATHにクロスコンパイラーがある
  • クロスコンパイラを指すようにCCおよびCXX環境変数を設定します。
  • 適切な--Hostと--buildを与える

    buildpath    <--- my little script to setup my $PATH
    export CC=arm_v5t_le-gcc
    export CXX=arm_v5t_le-g++
    ./configure --Host=armv5tl-montavista-linux-gnueabi --build=x86_64-linux-gnu
    
9
Brad Grissom

環境変数CC、LD、およびその他の関連する変数をオーバーライドする必要があります。これらのスイッチを設定しても、クロスツールチェーンの場所がどこにあるかはわかりません(どこにでもある可能性があります)。

たとえば、さまざまなプロジェクトのいくつかのガイドを確認してください。 http://wiki.wxwidgets.org/Cross-Compiling_Under_Linux

また、node.jsのクロスコンパイルをセットアップするために作成したスクリプトもここにあります-同じアイデア: https://Gist.github.com/edhemphill/5094239

Libjpegは、x86バイナリであるb/cでは機能しません。次のように指定する必要があります。

 ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26, not stripped

または類似。

これがskipping incompatibleを取得する理由です

3
EdH
# Install arm-linux-gnueabi packages
apt-get install libc6-armel-cross libc6-dev-armel-cross \
binutils-arm-linux-gnueabi arm-linux-gnueabi-gcc libncurses5-dev

./configure --target=arm-linux-gnueabi --Host=arm-linux-gnueabi
...
checking for arm-linux-gnueabi-gcc... arm-linux-gnueabi-gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables... 
checking whether we are cross compiling... yes
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether arm-linux-gnueabi-gcc accepts -g... yes
checking for arm-linux-gnueabi-gcc option to accept ISO C89... none needed
checking whether arm-linux-gnueabi-gcc understands -c and -o together... yes
checking whether make supports the include directive... yes (GNU style)
checking dependency style of arm-linux-gnueabi-gcc... gcc3
...

make
arm-linux-gnueabi-gcc -DPACKAGE_NAME=\"Tutorial\ Program\" -DPACKAGE_TARNAME=\"tutorial-program\" -DPACKAGE_VERSION=\"1.0\" -DPACKAGE_STRING=\"Tutorial\ Program\ 1.0\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DPACKAGE=\"tutorial-program\" -DVERSION=\"1.0\" -I.     -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.c
0
x4444