话说要在arm开发板的linux系统中运行apache服务器,需要在pc linux系统中交叉编译Apache源码,在网上参考了很多资料都是1.3版本的,最后终于找到apache 2移植到arm开发板的方法,现整理如下文。由于开发板的不同,可能这里出现的问题大家不会都遇到,但相信多数问题都已覆盖。

一、安装pcre

tar -xvzf pcre-8.31.tar.gz

cd pcre-8.31

./configure --prefix=$ARMROOTFS/usr/pcre --host=arm-linux CC=$TOOLCHAIN/arm-linux-gcc

make

make install

二、安装apr

这里特别提醒,先看一下后面的几点一些要注意的地方,特别是第⑤点

tar -xvzf apr-1.4.6.tar.gz

cd apr-1.4.6

./configure --prefix=$ARMROOTFS/usr/apr --host=arm-linux CC=$TOOLCHAIN/arm-linux-gcc  ac_cv_file__dev_zero=yes ac_cv_func_setpgrp_void=yes apr_cv_tcp_nodelay_with_cork=yes --cache=arm-linux.cache

这里简要说明一下如果不添加某些选项会出现的错误提示及一些需要特别注意的地方(这里按照我所记录的错误出现的顺序说明,而不是按上面选项的顺序):

①如果不添加ac_cv_file__dev_zero=yes(注意file和dev之间是两个下划线),则会出现错误:

check for /dev/zero... configure:error:cannot check for file existence when cross compile

②如果不添加ac_cv_func_setpgrp_void=yes,则会出现错误:

checking whether setpgrp takes no argument... configure: error: cannot check setpgrp when cross compiling

③选项--cache=arm-linux.cache中,arm-linux.cache为自己建立编写的文件(在编译过程中内容会被修改),在建立时需要自己写入如下内容(这个选项可能有些开发板不需要):

apr_cv_process_shared_works=yes

apr_cv_mutex_robust_shared=yes

如果不写入第一项,则会出现错误:

checking for working PROCESS_SHARED locks... configure:error: in `.../apr-1.4.6':

configure:error: cannot run test program while cross compiling

See `config.log' for more details

如果不写入第二项,则会出现:

checking for robust cross-process mutex support... configure: error: in `.../apr-1.4.6':

configure: error: cannot run test program while cross compiling

See `config.log' for more details

这些错误产生的原因在于这里在configure运行配置的过程中要运行几个测试程序来检验一些配置(个人理解),但在此处指定了编译时采用的编译器是交叉编译链,这几个测试程序都是经过交叉编译链编译产生的,而在宿主机系统上无法运行这些程序,因此只好自己手动指定这些检测程序最后运行的结果。

在以后为开发板配置软件包时遇到这种错误:configure:error:cannot run test program while cross compiling,应该都可以通过这种方法解决。

那么如果查找出这些表示结果的变量呢?只要在configure文件中搜寻这些错误的关键字即可,如这里的第一个项,我们可以搜寻:working PROCESS_SHARED locks,然后在configure文件中可以锁定到如下代码段:

C++代码...

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working PROCESS_SHARED locks">&5

$as_echo_n "checking for working PROCESS_SHARED locks... ">&6; }

if${apr_cv_process_shared_works+:}false; then :

$as_echo_n "(cached) ">&6

else

...

这里可以看出变量apr_cv_process_shared_works便是与这个程序运行结果关联的变量。

④如果不添加ac_cv_sizeof_struct_iovec=8选项,则会在使用make指令时出现错误:

./include/apr_want.h:95: error: redefinition of 'struct iovec'

make[1]: *** [passwd/apr_getpass.lo] 错误 1

⑤在添加了ac_cv_sizeof_struct_iovec=8选项后,还需要对configure文件进行一下修改,搜索apr_ssize_t可以定位到下面一段代码:

C++代码{ $as_echo"$as_me:${as_lineno-$LINENO}: checking which format to use for apr_ssize_t">&5

$as_echo_n "checking which format to use for apr_ssize_t... ">&6; }

iftest -n"$ssize_t_fmt"; then

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: %$ssize_t_fmt" >&5

$as_echo "%$ssize_t_fmt">&6; }

elif test "$ac_cv_sizeof_ssize_t"="$ac_cv_sizeof_int"; then

ssize_t_fmt="d"

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: %d">&5

$as_echo "%d">&6; }

elif test "$ac_cv_sizeof_ssize_t"="$ac_cv_sizeof_long"; then

ssize_t_fmt="ld"

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: %ld">&5

$as_echo "%ld">&6; }

else

as_fn_error $? "could not determine the proper format for apr_ssize_t""$LINENO"5

fi

将中间添加一段代码(红色标注),修改为:

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking which format to use for apr_ssize_t" >&5

$as_echo_n "checking which format to use for apr_ssize_t... " >&6; }

if test -n "$ssize_t_fmt"; then

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: %$ssize_t_fmt" >&5

$as_echo "%$ssize_t_fmt" >&6; }

elif test "$ac_cv_sizeof_ssize_t" = "$ac_cv_sizeof_int"; then

ssize_t_fmt="d"

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: %d" >&5

$as_echo "%d" >&6; }

elif test "$ac_cv_sizeof_ssize_t" = "$ac_cv_sizeof_long"; then

ssize_t_fmt="ld"

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: %ld" >&5

$as_echo "%ld" >&6; }

elif test "$ac_cv_sizeof_ssize_t" = "$ac_cv_sizeof_long_long";then

ssize_t_fmt="lld"

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: %lld" >&5

$as_echo "%lld" >&6; }

else

as_fn_error $? "could not determine the proper format for apr_ssize_t" "$LINENO" 5

fi

搜索apr_size_t可以定位到下面一段代码:

C++代码{ $as_echo"$as_me:${as_lineno-$LINENO}: checking which format to use for apr_size_t">&5

$as_echo_n "checking which format to use for apr_size_t... ">&6; }

iftest -n"$size_t_fmt"; then

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: %$size_t_fmt">&5

$as_echo "%$size_t_fmt">&6; }

elif test "$ac_cv_sizeof_size_t"="$ac_cv_sizeof_int"; then

size_t_fmt="d"

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: %d">&5

$as_echo "%d">&6; }

elif test "$ac_cv_sizeof_size_t"="$ac_cv_sizeof_long"; then

size_t_fmt="ld"

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: %ld">&5

$as_echo "%ld">&6; }

else

as_fn_error $? "could not determine the proper format for apr_size_t""$LINENO"5

fi

将中间添加一段代码(红色标注),修改为:

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking which format to use for apr_size_t" >&5

$as_echo_n "checking which format to use for apr_size_t... " >&6; }

if test -n "$size_t_fmt"; then

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: %$size_t_fmt" >&5

$as_echo "%$size_t_fmt" >&6; }

elif test "$ac_cv_sizeof_size_t" = "$ac_cv_sizeof_int"; then

size_t_fmt="d"

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: %d" >&5

$as_echo "%d" >&6; }

elif test "$ac_cv_sizeof_size_t" = "$ac_cv_sizeof_long"; then

size_t_fmt="ld"

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: %ld" >&5

$as_echo "%ld" >&6; }

elif test "$ac_cv_sizeof_size_t" = "$ac_cv_sizeof_long_long"; then

size_t_fmt="lld"

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: %lld" >&5

$as_echo "%lld" >&6; }

else

as_fn_error $? "could not determine the proper format for apr_size_t" "$LINENO" 5

fi

如果什么修改也不做,则会出现错误:

checking which format to use for apr_ssize_t... configure:error:could not determine the proper format for apr_ssize_t

如果只做了第一个修改,则会出现错误:

checking which format to use for apr_size_t... configure:error:could not determine the proper format for apr_size_t

这是apr源代码包本身有的bug,这样修改后,在最后编译httpd时,会出现一些warning,大概意思是说参数类型为pid_t的地方,出现的参数类型为long long,但pid_t的类型本身就是unsigned int,因此应该是没有问题的。

三、安装apr-util

tar -xvzf apr-util-1.4.1.tar.gz

cd apr-util-1.4.1

./configure

./configure --prefix=$ARMROOTFS/usr/local/apr-util --with-apr=$ARMROOTFS/usr/local/apr --host=arm-linux CC=$TOOLCHAIN/arm-linux-gcc

make

make install

四、安装httpd

这里提醒一下先看一下后面的几点要注意的地方,特别是第②点

tar -xvzf httpd-2.4.3.tar.gz

cd httpd-2.4.3

./configure --prefix=$ARMROOTFS/etc/apache --with-pcre=$ARMROOTFS/usr/local/pcre --with-apr=$ARMROOTFS/usr/local/apr --with-apr-util=$ARMROOTFS/usr/local/apr-util --host=arm-linux CC=$TOOLCHAIN/arm-linux-gcc ap_cv_void_ptr_lt_long=no --enable-so --enable-cgi LDFLAGS=-lpthread --with-mpm=prefork

make

make install

在编译过程中要注意以下几点:

①如果不添加ap_cv_void_ptr_lt_long=no选项,则会出现错误:

configure: error: Size of "void *" is less than size of "long"

②如果不添加--with-mpm=prefork选项,若开发板不兼容thread-safe,则apache会启动不了,并且logs/error_log中会记录错误:

[mpm_event:crit] [pid 0:tid 1073875872] (70023)This function has not been implemented on this platform: AH00495: Couldn't create a Thread Safe Pollset. Is it supported on your platform?Also check system or user limits!

③在执行过./configure指令后,在为开发板编译httpd执行make命令前,需要先对宿主机上编译过一次httpd(即至少执行到make,make install可不执行,宿主机上不最终安装apache2也是可以的),然后到为开发板编译httpd的httpd-2.4.3目录下的server目录中,修改一下其中的Makefile文件,找到如下行:

test_char.h: gen_test_char

./gen_test_char > test_char.h

修改为

test_char.h: gen_test_char

#./gen_test_char > test_char.h

$httpd_for_pc/server/gen_test_char > test_char.h

其中这里的变量httpd_for_pc只是指代为宿主机编译的httpd软件包加压后的文件夹路径。

如果不做上面任何修改,则会出现以下错误:

./gen_test_char > test_char.h

/bin/bash: ./gen_test_char: 无法执行二进制文件

原因也是因为宿主机上无法运行使用交叉编译链编译的程序的缘故。

如果只修改为:

test_char.h: gen_test_char

#./gen_test_char > test_char.h

而在宿主机上不编译一次httpd,则会出现以下错误:

util.c: In function 'ap_find_token':

util.c:1434: error: 'test_char_table' undeclared (first use in this function)

util.c:1434: error: (Each undeclared identifier is reported only once

util.c:1434: error: for each function it appears in.)

util.c:1434: error: 'T_HTTP_TOKEN_STOP' undeclared (first use in this function)

util.c: In function 'ap_escape_shell_cmd':

util.c:1498: error: 'test_char_table' undeclared (first use in this function)

util.c:1498: error: 'T_ESCAPE_SHELL_CMD' undeclared (first use in this function)

util.c: In function 'ap_escape_path_segment_buffer':

util.c:1706: error: 'test_char_table' undeclared (first use in this function)

util.c:1706: error: 'T_ESCAPE_PATH_SEGMENT' undeclared (first use in this function)

util.c: In function 'ap_os_escape_path':

util.c:1740: error: 'test_char_table' undeclared (first use in this function)

util.c:1740: error: 'T_OS_ESCAPE_PATH' undeclared (first use in this function)

util.c: In function 'ap_escape_urlencoded_buffer':

util.c:1759: error: 'test_char_table' undeclared (first use in this function)

util.c:1759: error: 'T_ESCAPE_URLENCODED' undeclared (first use in this function)

util.c: In function 'ap_escape_logitem':

util.c:1844: error: 'test_char_table' undeclared (first use in this function)

util.c:1844: error: 'T_ESCAPE_LOGITEM' undeclared (first use in this function)

util.c: In function 'ap_escape_errorlog_item':

util.c:1896: error: 'test_char_table' undeclared (first use in this function)

util.c:1896: error: 'T_ESCAPE_LOGITEM' undeclared (first use in this function)

util.c: In function 'ap_append_pid':

可见./gen_test_char > test_char.h这条语句是为了生成一些宏定义或者全局变量到test_char.h这个头文件中去,而里面这些宏定义和全局变量又在httpd源程序的中使用到。因此宿主机系统也必须编译一次httpd才可以完成开发板安装apache2服务器软件。

如果在执行上面的修改前执行过一次make,那么需要执行make clean命令后,再执行make才能编译通过。

经过以上步骤后,进入开发板文件系统目录,修改etc/apache/bin目录下的apachectl文件,搜索HTTPD,可以找到该变量,将该变量的值修改为:HTTPD='/etc/apache/bin/httpd'。

为了方便以后在开发板上输入打开和关闭apache2服务器的指令,可以执行以下命令:

sudo cp $ARMROOTFS/etc/httpd/bin/apachectl $ARMROOTFS/usr/sbin/

sudo cp $ARMROOTFS/etc/httpd/bin/apachectl $ARMROOTFS/etc/init.d/

五、将apache拷贝到arm开发板

1. 把在 /usr/local/下生成的目录 apache拷贝到你的开发板根文件系统的 …/usr/local/ 目录下。

2. 修改配置http.conf文件。在…/usr/local/apache/conf/ 目录下,用文本编辑器打开。

还有注意的是,apache拒绝使用root用户运行。所以你需要增加一个用户和用户组,我们可以使用 http.conf配置文件默认的用户名和用户组名,nobody和nobody。具体来说就是在ARM Linux根文件系统上建立/etc/passwd和/etc/group两个文件,它们的内容可以如下:

/etc/passwd

root::0:0:root:/:/bin/ash

nobody::65534:65533:nobody:/:/bin/ash

/etc/group

nobody::65533:

nogroup::65534:nobody

root::0:

users::100

如果rootfs中有这两个文件,那么就只需要检查一下是不是有nobody用户和nogroup组。

六、复制共享库(为宿主机系统编译安装apache2不需要进行这一步)

之后还需要复制一些共享库到开发板文件系统的/usr/lib目录下,否则会启动不了apache2服务器,像以下错误:

①error while loading shared libraries: libpcre.so.1:cannot open shared object file:No such file for directory

解决方法:cp $ARMROOTFS/usr/local/pcre/lib/libpcre.so* $ARMROOTFS/usr/lib

②error while loading shared libraries: libaprutil-1.so.0:cannot open shared object file:No such file for directory

解决方法:cp $ARMROOTFS/usr/local/apr-util/lib/libaprutil-1.so* $ARMROOTFS/usr/lib

③error while loading shared libraries: libexpat.so.0:cannot open shared object file:No such file for directory

解决方法:cp $ARMROOTFS/usr/local/apr-util/lib/libexpat.so* $ARMROOTFS/usr/lib

④error while loading shared libraries: libapr-1.so.0:cannot open shared object file:No such file for directory

解决方法:cp $ARMROOTFS/usr/local/apr/lib/libapr-1.so* $ARMROOTFS/usr/lib

⑤error while loading shared libraries: libuuid.so.1:cannot open shared object file:No such file for directory(某些开发板可能不会出现这个问题)

解决方法:需要编译一次e2fsprogs这个软件包,使它生成这个共享库。

tar -xvzf e2fsprogs-1.42.8.tar.gz

cd e2fsprogs-1.42.8

./configure --prefix=$ARMROOTFS/usr/local/e2fsprogs --host=arm-linux CC=$TOOLCHAIN/arm-linux-gcc --enable-elf-shlibs

make

make install(可以不执行这一步)

之后在软件包加压后的e2fsprogs-1.42.8目录下执行:

cp lib/libuuid.so* $ARMROOTFS/usr/lib/

七、启动apache

最后,我们就可以进入到开发板进入到apache的bin目录中,执行命令./apachectl start来启动apache。

还可以将 httpd 应用程序拷贝到 /usr/sbin 文件夹下并设置其为开机自启动。向 /etc/init.d/rc 文件最后添加命令httpd。

除非特别注明,鸡啄米文章均为原创

2015年9月17日

作者:鸡啄米

浏览:

apache arm 交叉编译_Apache 2移植到Arm开发板的过程整理——如何交叉编译Apache 2相关推荐

  1. 学习ARM架构,系统移植和驱动开发总结

    本次结束了对ARM架构,系统移植和驱动开发的学习,它们都是属于底层,难度想对都比较的难一点,但先学习arm架构之后去学习系统移植和驱动开发,会使自己对系统移植和驱动开发容易理解点. arm架构 arm ...

  2. Qt5.14.2移植到SOM-RK3399开发板

    Qt5.14.2移植到SOM-RK3399开发板 1. 主机开发环境 2. 安装aarch64-linux-gnu-g++交叉编译工具 3. 移植Qt 3.1 修改Qt源码中的Makefile说明文档 ...

  3. 移植dropbear到开发板

    添加dropbear功能 介绍 由于OpenSSH因为其相对较大,一般不太适用于嵌入式平台,多用于PC或者服务器的Linux版本中.而Dropbear是由Matt Johnston所开发的Secure ...

  4. 调试来自于逐飞的MM32F3277移植有MicroPython开发板

    简 介: 对于从逐飞寄送的MicroPython开发板进行初步测试,建立了基于REPL进行交互式开发的环境. 关键词: MicroPython,MM32,Thonny #mermaid-svg-BUT ...

  5. 移植tslib到开发板及部分问题解决

    qt的tslib的具体移植步骤和过程就不多讲了,我说说我按照手册移植好tslib后在开发板运行提示的错误以及我的解决方法,当然每个人的提示可能一样,解决方法就不一样,我也是个初学者,所以方法仅供大家参 ...

  6. Qt5.14.2移植到SOM-RK3399开发板上的问题解决办法

    Qt5.14.2移植到SOM-RK3399开发板上的问题解决办法 1. 概述 2. 配置Qt5.9.5 2.1 mkspec配置文件 2.2 配置脚本 2.3 执行make docs时出现的错误 2. ...

  7. STM32F407霸天虎FreeRTOS学习笔记——移植FreeRTOS到开发板上

    STM32F407霸天虎FreeRTOS学习笔记--移植FreeRTOS到开发板上 FreeRTOS源码获取 移植第一步:创建文件夹 Keil main.c 实验效果 FreeRTOS源码获取 在移植 ...

  8. MPlayer在ARM上的移植(S5PV210开发板)

    MPlayer 1.0已经把大部分解码库都自带了,如ffmpeg,但是自带的音频库在S5PV210下效果非常不好.换成使用libmad效果不错.因此MPlayer 在ARM-Linux的最简单的移植只 ...

  9. 编译linux系统到开发板,Linux系统有关交叉编译和移植到6410开发板上的简单过程...

    在进行移植之前,要检查一下目标机(这里指6410开发板)与宿主机之间的接线问题,即串口线.网线是否正确连接,目标机的电源是否插好!在接线问题解决后,才能保证交叉编译正常进行! 个人理解,移植的主要思想 ...

最新文章

  1. android插件式换肤,Android学习之插件化换肤
  2. 如何删除Struts2动作的后缀扩展名
  3. mysql 同步更新_MySQL slave 不能同步更新
  4. SAP Analytics Cloud连接Cloud for Customer的一些后台调试
  5. git master主分支_Git分支管理策略及简单操作
  6. 【Matlab/C/Python/VB/...】代码复制到word时如何变成彩色的
  7. ajax 解析数组集合,ajax怎样解析json数组并用模板引擎渲染
  8. beetl java例子_初识Java模板引擎Beetl之简单示例
  9. JZOJ5371 组合数问题
  10. 编辑按钮 php,自动编辑按钮-海豚PHP1.0.6完全开发手册-基于ThinkPHP5.0.10的快速开发框架...
  11. AutoCAD实用小技巧教程。
  12. 启动kafka时报错:java.nio.file.FileSystemException,另一个程序正在使用此文件,进程无法访问。
  13. 从word中无损批量导出图片
  14. 陌陌八成营收靠直播 直播行业已进入两极分化
  15. Jetson 配置中文环境,中文输入法,安装QQ
  16. NVIDIA Jetson: GStreamer 和 openMAX(gst-omx) 插件
  17. 修改手机开机Logo界面(Redmi Note 7)
  18. 今天带大家学习软件测试用例设计(等价类划分和边界值法)
  19. Java实现子序列问题
  20. Java-什么是软件?

热门文章

  1. arduino为何流行?
  2. Win7 系统设置虚拟无线热点
  3. python图案填充_用matplotlib用自定义图案填充多边形
  4. Fast R-CNN 论文详读
  5. “功夫高考”之高考状元的七种武器
  6. [日常] go语言圣经-声明,变量,赋值,类型,包和文件习题
  7. c语言字母分别代表的意思,C语言中%c,%s分别代表什么意思? 在C语言中c% 和 d% 是表示什么意思?...
  8. java斗图表情_Java爬取斗图网站的所有表情包
  9. dB与倍数换算速查表
  10. elasticsearch 关键词查询-实现like查询