第一步,安装pcre:

tar -xvzf pcre-8.31.tar.gz

cd pcre-8.31

./configure --prefix=$ARMROOTFS/usr/pcre

的错误,如下图:

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

{ $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; }

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可以定位到下面一段代码

{ $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; }

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 CXX=$TOOLCHAIN/arm-linux-g++ LD=$TOOLCHAIN/arm-linux-ld

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 CXX=$TOOLCHAIN/arm-linux-g++ LD=$TOOLCHAIN/arm-linux-ld ap_cv_void_ptr_lt_long=no --enable-so --enable-cgi LDFLAGS=-lpthread

make DESTDIR=$ARMROOTFS

make install

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

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

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

的错误,如下图:

②在执行过./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/

第五步:复制共享库(为宿主机系统编译安装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 LD=$TOOLCHAIN/arm-linux-ld --enable-elf-shlibs

make

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

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

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

第六步及之后:还没有解决的问题

本人经过上面的编译安装后,在开发板进入系统后,执行apachectl指令,仍然未能成功启动apache服务器,系统提示错误为:

AH00141:Could not initialize random number generator

Apache 2 移植到Arm开发板的更多相关文章

  1. iTOP-IMX6UL 实战项目:ssh 服务器移植到 arm 开发板

    实验环境:迅为提供的Ubuntu12.04.2 以及虚拟机 编译器:arm-2009q3 编译器 开发板系统:QT系统   开发板使用手册中给Windows 系统安装了 ssh 客户端,给 Ubunt ...

  2. iTOP-4412开发板-实战教程-ssh服务器移植到arm开发板

    本文转自迅为开发板:http://www.topeetboard.com 在前面实战教程中,移植了“串口文件传输工具”,整个移植过程是比较简单的,而且我 们没有做任何协议方面的了解,只是“配置”+“编 ...

  3. Opencv2.2 移植到am335x-y开发板

    1.虚拟机上运行cmake-gui,报找不到文件,指示安装. 2.下载opencv2.2.0 http://opencv.org/downloads.html 3.cmake-gui,配置参考< ...

  4. 使用arm开发板搭建无线mesh网络(二)

    上篇博文介绍了无线mesh网络和adhoc网络的区别,这篇文章将介绍无线mesh网络的骨干网节点的组建过程.首先需要介绍下骨干网节点的设计方案:每个骨干网节点都是由一块友善之臂的tiny6410 ar ...

  5. linux 3.4.103 内核移植到 S3C6410 开发板 移植失败 (问题总结,日本再战!)

    linux 3.4.103 内核移植到 S3C6410 开发板 这个星期差点儿就搭在这里面了,一開始感觉非常不值得,移植这样的浪费时间的事情.想立刻搞定,然后安安静静看书 & coding. ...

  6. ubuntu 交叉编译qt 5.7 程序到 arm 开发板

    ubuntu 交叉编译qt 5.7 程序到 arm 开发板平台1 ubuntu 12.042 arm-linux-gcc 4.5.13 QT 5.74 开发板210 armcortex-A8 一 概述 ...

  7. ARM开发板挂载U盘

    ARM开发板运行Linux系统后,插入U盘,通过串口打印系统识别到U盘如下: 系统识别U盘盘符为sda4 那么需要挂载后才能操作U盘:挂载命令 mount -t vfat /dev/sda4 /mnt ...

  8. 使用arm开发板搭建无线mesh网络(一)

    由于项目的需要,老板让我使用arm开发板(友善之臂的tiny6410)搭建无线mesh网络.一般而言,无线自组织网络的网络设备都是由用户的终端设备来充当,这些终端设备既要处理用户的应用数据,比如娱乐, ...

  9. 【原创】车载实时路况信息接收终端移植于Smart210开发板 --- 综合教程

    [原创]车载实时路况信息接收终端移植于Smart210开发板 --- 综合教程 所用工具: windows电脑 Ubuntu12.04 Smart210开发板 4g以上SD卡 U盘 步骤: 1.    ...

随机推荐

  1. git获取远程仓库代码

    首先在本地创建一个目录“ MyProject”,用来存放工程文件,git进入该文件夹,执行 git clone 远程项目MyCode地址 将代码克隆到本地然后进入“MyCode”文件夹下 cd MyC ...

  2. UILocalNotification 的使用

    @IBAction func sendNotification(sender: AnyObject) { var userInfo = Dictionary<String,String>( ...

  3. JavaScript Big-Int

    这个库是为JavaScript中的大整数操作,如加,减,乘,除,mod,比较等. 这个库的原理是模拟笔和纸的操作,你可以操作整数,大到你的RAM允许. 例 var bigInt = require(' ...

  4. Linux系统的SVN客户端使用技巧详解

    忽略文件/文件夹 假设想忽略文件temp,cd到temp所在的目录下: $ svn propedit svn:ignore . [注意:请别漏掉最后的点(.表示当前目录),如果报错请看后面] 打开的文 ...

  5. Java中的并发编程集合使用

    一.熟悉Java自带的并发编程集合 在java.util.concurrent包里有很多并发编程的常用工具类. package com.ietree.basicskill.mutilthread.co ...

  6. Django restframwork实现自定义数据格式的分页与搜索

    最近因为在做分页时遇到的问题很多,页浪费了好多时间,所以记录一下.以后如遇到可用省去不必要的麻烦 restframwork中的官方文档对分页和搜索页进行了详细的介绍,但是我公司需要的return的js ...

  7. mysql数据库从删库到跑路之mysql存储引擎

    一 什么是存储引擎 mysql中建立的库===>文件夹 库中建立的表===>文件 现实生活中我们用来存储数据的文件应该有不同的类型:比如存文本用txt类型,存表格用excel,存图片用pn ...

  8. Springboot 日志管理配置logback-spring.xml

    几种常见的日志 Log4j:是最早的日志框架,是apach旗下的,可以单独使用,也可配合日志框架JCL使用: Log4j2:apach旗下的关于log4j的升级版: Logback:是基于slf4j接 ...

  9. ruby中的方法查找

    ruby中的方法调用都是 对象.方法 的形式,那么对象如何找到这个方法呢? 首先必须了解祖先链的概念,祖先链就是从一个类开始,到它的父类,再到父类的父类...一直到最终的起点(ruby中是BasicO ...

  10. 145. Binary Tree Postorder Traversal(二叉树后序遍历)

    Given a binary tree, return the postorder traversal of its nodes' values. For example:Given binary t ...