16

我在使用 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

我很茫然,我已经在谷歌上搜索了一个小时......

4

4 回答 4

17

所以我知道我在使用真正基本的方法调用之前已经进行了交叉编译,并且在检查输出之后我弄清楚了为什么我已经摆脱了这个:

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在更高级的编译中抛出一些标志。

于 2013-03-05T22:56:08.597 回答
10

我认为这个问题可以更一般地重述为:“我如何使用 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

请注意,当他们定义--hostand 和的用法时--build

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

这是我刚刚iperf为我的嵌入式 ARM 平台配置的示例:

首先,“./configure”脚本实际上被称为“Autoconf”,这对 google-ing 很有帮助。这里的想法是:

  • 让你的交叉编译器在你当前的 $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
    
于 2014-01-16T23:17:44.517 回答
2

您需要覆盖环境变量 CC、LD 和其他相关变量。设置这些开关并不能告诉配置您的交叉工具链在哪里(它可能在任何地方)

查看各种项目的一些指南,例如: http ://wiki.wxwidgets.org/Cross-Compiling_Under_Linux

另外,这是我为 node.js 设置交叉编译的脚本 - 相同的想法: https ://gist.github.com/edhemphill/5094239

libjpeg 不能工作 b/c 它是 x86 二进制文件,你需要它说:

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

或类似的。

这就是你得到一个skipping incompatible

于 2013-03-05T22:05:36.480 回答
0

# 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

于 2018-10-11T02:17:22.427 回答