目标:静态编译
版本:apache-1.3.39 + php-5.5.5
PC环境:ubuntu16
交叉编译工具链:arm-linux-gcc
首先可以参考:https://www.cnblogs.com/eoiioe/archive/2008/12/23/1360476.html,按照这样的思路进行。
一 . 编译apache
解压目录
1.本机编译。
进入到 pc/src目录下执行 ./Configure 命令,生成Makefile文件。
返回到 pc目录下,执行 ./configure命令,然后 make,这里不需要make install.
因为在交叉编译的时候,只需要用到主机编译的在 pc/src/main 目录下生成的两个可执行文件,分别为gen_test_char 和 gen_uri_delims。
2.交叉编译
配置自己的交叉编译工具链环境,在添加到/etc/profile后source一下,终端测试arm-linux-gcc -v,返回该交叉编译链的具体信息,再export CC=arm-linux-gcc即可(该shell命令可直接写在/etc/profile中,不用在终端输出了),然后步骤依然同上:
进入到 arm/src目录下执行 ./Configure 命令,生成Makefile文件。
返回到 arm目录下,执行 ./configure命令, 其配置选项如下:
#!/bin/sh
./configure \
--prefix=/mnt/nand1-2/apache \
--enable-module=most \
--enable-module=rewrite
TIM截图20190830194333.png
或者
/home/f/下载/Apache/arm/src/helpers/testfunc: 1: Syntax error: word unexpected (expecting ")")
/home/f/下载/Apache/arm/src/helpers/testfunc: 1: Syntax error: word unexpected (expecting ")")
/home/f/下载/Apache/arm/src/helpers/testfunc: 1: Syntax error: word unexpected (expecting ")")
/home/f/下载/Apache/arm/src/helpers/testfunc: 1: Syntax error: word unexpected (expecting ")")
/home/f/下载/Apache/arm/src/helpers/testfunc: 1: Syntax error: word unexpected (expecting ")")
这里将 pc/src/main/下的上面所说的两个可执行文件复制(也说覆盖)到arm/src/main/下,然后再进行make即可,若再次出现同样的错误,可再次进行同样的复制操作,再make。(注,make规则中如果依赖文件中任一个 文件的时间戳比目标文件新,则使用规则所定义的命令重建目标文件。)
在make过程中,可能有
TIM截图20190830200515.png
这里找到对应文件,注释掉相应选项再次make即可。
TIM截图20190830200742.png
TIM截图20190830200800.png
无需make install,进行第二步。
二 .交叉编译php
为实现静态编译,这里需要提前安装php所需要的静态库,这里我安装了5种静态库文件,分别使用了libxml2-2.9.2, openssl-1.0.2q, zlib-1.2.8, libiconv-1.14, pcre-7.8, 安装的路径可自定义,但尽量安装到一个主文件路径下,如默认的 /usr/local/ 。另外,由于php5以上版本默认支持sqlite选项,因此这里就不在配置了。
关于./configure配置选项我写在go.sh文件里面了,该文件内容如下,执行时给文件 chmod+x 即可。
#! /bin/sh
./configure \
--host=arm-linux \
--prefix=/mnt/nand1-2/php \
--enable-shared=no \
--disable-shared \
--with-apache=/home/f/下载/Apache/arm \
--enable-static=yes \
--enable-sockets \
--disable-all \
--enable-pdo \
--enable-json \
--disable-ipv6 \
--enable-sqlite-utf8 \
--with-libxml-dir=/usr/local/libxml2 \
--with-openssl-dir=/usr/local/openssl/include/openssl \
--with-zlib-dir=//home/f/downloads/NewPHP/zlib \
--with-iconv-dir=/home/f/downloads/NewPHP/libiconv \
--with-pcre-dir=/home/f/downloads/NewPHP/pcre
#--with-sqlite3=/usr/local/sqlite3\lib\libsqlite3.a \
#--with-pdo-sqlite \
#--enable-sqlite3 \
这里必须配置--with-apache,生成apache 所load的静态库文件,后面跟的路径就是上面apache解压编译所在的路径(arm文件夹路径)。
上述配置只是编译静态库文件 .a ,我们还需要生成静态可执行文件 statically linked
参考:http://ju.outofmemory.cn/entry/119804
这里在makefile中,更改:
-o 前面加上-all-static
make,该过程可能会出现下面错误
TIM截图20190830181533.png
这里只需要定位到文件,然后将这个预编译选项注释掉即可。make成功后,可以看到在文件夹下,php解压编译文件夹下libs文生成了libphp5.a文件和libphp5.la文件,而且在对应的apache解压编译文件夹arm下的src/modules/php5页生成了相应的文件,我们第三步的activate路径就是从这取。
make install ,可以看到安装目录/mnt/nand1-2/php下面有bin文件夹有php、php-cgi文件,有
TIM截图20190830191713.png
成功编译静态库和静态可执行文件。当然这两个静态可执行文件内存有点大,用arm-linux-strip一下即可。
6.复制编译目录下的php.oni-development到安装目录/mnt/nand1-2/php/lib下,并改名php.ini。
三 .再次编译apache,跟第一步动作类似。
但是:
当再次在arm文件夹下进行./configure配置,有
#!/bin/sh
./configure \
--prefix=/mnt/nand1-2/apache \
--activate-module=src/modules/php5/libmodphp5.a
--enable-module=most \
--enable-module=rewrite
2.上面一步是添加php配置选项,以及表示静态编译的方式,链接现有的静态库文件,以后不加载任何动态模块,而这一步需要进行生成apache静态可执行文件的设置。
在arm/src文件夹下的Makefile中,下面图中在 -o 符号之前添加 -static 选项
TIM截图20190830201924.png
在arm/src/support文件夹下的Makefile中,下面图中在 -o 符号之前添加 -static 选项
TIM截图20190830201635.png
3.如果跟第一步报同样的错,按第一步的规则处理,在arm文件夹下执行make,然后make install安装。
四 .此时在/mnt/nand1-2/文件夹下已经有两个最终安装后的apache和php文件夹。在将两者复制到开发板同样的位置,并使用,还得配置http.conf文件。
# 首先是基本的配置
Listen 0.0.0.0:80
Port 80
User nobody
Group nogroup
ServerName localhost
#然后
#205行
# Note: The order in which modules are loaded is important. Don't change
# the order below without expert advice.
# Example:
# LoadModule foo_module libexec/mod_foo.so
####这里不需要动态加载php动态库文件,因为我们需要静态编译
####即无需LoadModule php5_module modules/libphp5.so
# ExtendedStatus controls whether Apache will generate "full" status
#364行
DirectoryIndex index.html
DirectoryIndex index.php
DirectoryIndex index.php3
DirectoryIndex index.phtml
#763行
#
AddType application/x-tar .tgz
AddType application/x-httpd-php .php
AddType application/x-httpd-php .php3
AddType application/x-httpd-php .php5
AddType application/x-httpd-php .phtml
#
# AddEncoding allows you to have certain browsers uncompress
# information on the fly. Note: Not all browsers support this.
# Despite the name similarity, the following Add* directives have nothing
# to do with the FancyIndexing customization directives above.
#
AddEncoding x-compress .Z
AddEncoding x-gzip .gz .tgz
Action application/x-httpd-php "/php5/php-cgi"
由于apache拒绝使用root用户运行,所以需要增加一个用户和用户组,这里使用默认的用户名和用户组名,nobody和nogroup。
建立文件passwd代替开发板上的/etc/passwd
root::0:0:root:/:/bin/sh
nobody::65534:65533:nobody:/:/bin/sh
建立文件group代替开发板上的/etc/group
nobody::65533:
nogroup::65534:nobody
root:x:0:root
users::100:
五. 启动开发板,在终端有
mnt/nand1-2/apache/bin/apachectl start
则开发板上的apache服务已启动,下面即可以在主机通过ip访问嵌入式web了。