arm交叉编译lighttpd问题。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了arm交叉编译lighttpd问题。相关的知识,希望对你有一定的参考价值。

我在使用arm-linux编译器编译lighttpd。我用的系统是Ubuntu,用的指令是"CC=/home/cielo/GCC/FriendlyARM/toolschain/4.5.1/bin/arm-linux-gcc ./configure --host arm-linux --build pentium-pc-linux --without-zlib --without-bzip2 --target arm-linux".
我可以成功用上面的命令通过configure的步骤,但是当我接着进行make的时候就出现下面的问题。
"
In file included from base.h:24:0,
from mod_flv_streaming.c:1:
array.h:9:19: fatal error: pcre.h: No such file or directory
compilation terminated.
make[3]: *** [mod_flv_streaming.lo] Error 1
make[3]: Leaving directory `/home/cielo/Temp/lighttpd-1.4.30/src'
make[2]: *** [all] Error 2
make[2]: Leaving directory `/home/cielo/Temp/lighttpd-1.4.30/src'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/cielo/Temp/lighttpd-1.4.30'
make: *** [all] Error 2
"
如果我强行把/usr/include/pcre.h放到scr目录下,那么本来的错误信息没了,出现了下面的错误信息。
"
/home/cielo/GCC/FriendlyARM/toolschain/4.5.1/bin/../lib/gcc/arm-none-linux-gnueabi/4.5.1/../../../../arm-none-linux-gnueabi/bin/ld: skipping incompatible /usr/lib/libpcre.so when searching for -lpcre
/home/cielo/GCC/FriendlyARM/toolschain/4.5.1/bin/../lib/gcc/arm-none-linux-gnueabi/4.5.1/../../../../arm-none-linux-gnueabi/bin/ld: skipping incompatible /usr/lib/libpcre.a when searching for -lpcre
/home/cielo/GCC/FriendlyARM/toolschain/4.5.1/bin/../lib/gcc/arm-none-linux-gnueabi/4.5.1/../../../../arm-none-linux

-gnueabi/bin/ld: cannot find -lpcre
collect2: ld returned 1 exit status
make[3]: *** [mod_trigger_b4_dl.la] Error 1
make[3]: Leaving directory `/home/cielo/Temp/lighttpd-1.4.30/src'
make[2]: *** [all] Error 2
make[2]: Leaving directory `/home/cielo/Temp/lighttpd-1.4.30/src'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/cielo/Temp/lighttpd-1.4.30'
make: *** [all] Error 2
"
在这之前我在linux上编译了lighttpd并且现在lighttpd在linux上运行正常了,所以我之前用"apt-get install libpcre3 libpcre3-dev"命令安装PCRE的时候就说明安装正确了,那么为什么还会出现这个问题,请大家帮忙,谢谢。

不管你强行拷贝的/usr/include/pcre.h 还是 apt-get install libpcre3 libpcre3-dev 安装的,都是对应于你 linux 主机(即 ubuntu那台机器)上的 pcre, 而不是你要交叉编译的ARM 的 pcre, 都是无法用于 ARM 上的 lighttpd的。

所以你要么找到已经编译好的 ARM 的 pcre 库文件 (libpcre.so , libpcre.a) 及对应的头文件 pcre.h, 要么你就自己去编译一个。
参考技术A 初学ARM的人路过。

使用 Autoconf 为 ARM 进行交叉编译

【中文标题】使用 Autoconf 为 ARM 进行交叉编译【英文标题】:Cross-compiling for ARM with Autoconf 【发布时间】:2013-02-20 12:18:19 【问题描述】:

我在使用 autconf 为我的 arm 板交叉编译库时遇到问题。

我正在使用这条线:

./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】:

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

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 标志。

【讨论】:

我什至没有“/usr/bin/arm-linux-gnueabi-gcc-4.5”!但我是通过“apt-get install gcc-arm-linux-gnueabi”安装的 -prefix=$CSTOOL_DIR/linux_arm_tool 看起来不对。我认为 Autotools 选项使用双破折号,例如 --prefix=...【参考方案2】:

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

【讨论】:

【参考方案3】:

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

查看各种项目的一些指南,例如: 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的原因

【讨论】:

是的,这很有意义,并且期望如此。我只是无法弄清楚编译出错的地方。如果 --target 标志不自动使用正确的编译器和链接器,它的意义何在? 只要您不构建编译器(查看提到的libjpeg.so,我不这么认为)--target 标志无论如何都没有任何用处。 --target 指定创建的二进制文件将为其生成输出的机器的体系结构。因此,在机器 A 上构建的汇编器随后在机器 B 上运行以为机器 C 汇编代码将使用:--buid=A --host=B --target=C。如果生成的二进制文件没有生成任何代码,--target 标志不会进行任何更改。 所以我几乎应该通过环境变量设置整个 Makefile,直到链接器标志,例如 -rlink-path? 基本上,是的。这是因为交叉工具链本质上是独一无二的。交叉编译不适合胆小的人:) 所以我发现真正发生的事情是 autoconf 确实试图找到你的二进制文件,但它对我来说失败了。【参考方案4】:

# 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

【讨论】:

以上是关于arm交叉编译lighttpd问题。的主要内容,如果未能解决你的问题,请参考以下文章

arm-linux交叉编译器的路径设置问题,怎么办????

关于Linux上的arm-linux交叉编译工具链的问题:但是arm也有很多种啊! 这个工具是对所有的ARM都支持吗?

arm交叉编译工具链下载

为 arm 交叉编译 iptables 的问题

Paho C(ARM)的交叉编译问题

Ubuntu arm 交叉编译 and snapcraft