正在阅读:

树莓派交叉编译nginx-php

1,220

一. 目的

树莓派交叉编译支持nginx/php,使其支持动态web程序,学习nginx的架构.

二. nginx编译

1.  libatomic_ops编译

https://github.com/ivmai/libatomic_ops

工具链中没有这个库,也必须要用到,所以需要自己编译

2.     prce编译

主要是用于nginx.conf 用于重定向和php解析,正则表达式

3.     nginx源码修改

3.1   设置交叉工具链

autotest : 4 : not found

autotest:Syntax error: Unterminated quoted string bytes

./configure : error:can not detect int size

cat : /build/autotest.c: No such file or directory

原因:

configure通过运行测试程序来获得“int、long、longlong”等数据类型的大小,

由于交叉编译器所编译出的程序无法在编译主机上运行而产生错误。

解决:

可以通过修改configure文件来手动指定各数据类型的大小,但会非常麻烦。

由于编译主机与目标平台均为32位系统,故可以用“gcc”替代“arm-linux-gnueabihf-gcc”

来进行数据类型大小的测试(注意: 不同的编译环境可能编译器有点不同)

编辑auto/types/sizeof文件,大概36行的位置( $CC 改为 gcc )

ngx_test="$CC $CC_TEST_FLAGS $CC_AUX_FLAGS

该为ngx_test="gcc $CC_TEST_FLAGS $CC_AUX_FLAGS

3.2    auto/types/sizeof 变量大小

问题: 检测不到size

./configure:error:can not detect int size

cat: build/autotest.c: No such file ordirectory

解决:

两个问题,一个是检测不到size。一个是找不到测试程序源代码。

先解决 size 问题,修改 auto/types/sizeof 文件,找到 ngx_size= 这一行,改为 ngx_size=4

修改完之后,再次configure,发现 autotest.c 的问题也消失了。

测试文件时候会出错

3.3   auto/cc/name

checking for C compiler ... found but is not working

./configure error : C compiler gcc is not found

原因:

configure首先会编译一个小测试程序,通过测试其运行结果来判断编译器是否能正常工作,

由于交叉编译器所编译出的程序是无法在编译主机上运行的,故而产生此错误。

解决:

编辑auto/cc/name文件,将21行的“exit 1”注释掉(令测试程序不会报错)

3.4   auto/lib/pcre/make

问题:

checking whether the C compiler works...

configure: error: cannot run Ccompiled programs.

If you meant to cross compile, use `--host'.

出错的是pcre而不是openssl。原因是编译 pcre 没有指定 `--host' 参数

3.5   configure

3.6    /src/core/ngx_config.h

问题:

/build/src/core/ngx_cycle.o:In function `ngx_init_cycle':

/build/src/core/ngx_cycle.c:457:undefined reference to `ngx_shm_free'

/build/src/core/ngx_cycle.c:462:undefined reference to `ngx_shm_alloc'

原因:

`ngx_shm_free'函数未定义

通过查看源码可以发现,`ngx_shm_free'定义在

src/os/unix/ngx_shmem.c文件中,这个函数要正常使用的话必须要求

“NGX_HAVE_MAP_ANON、NGX_HAVE_MAP_DEVZERO、NGX_HAVE_SYSVSHM”这三个宏中有一个被定义。

解决:

修改ngx_auto_config.h ,加入这几行:

#ifndef NGX_HAVE_SYSVSHM

#define NGX_HAVE_SYSVSHM 1

#endif

3.7    /src/os/unix/ngx_errno.h

问题:

src/os/unix/ngx_errno.c : In function'ngx_strerror':

src/os/unix/ngx_errno.c : 37 : 31 :error:'NGX_SYS_NERR' undeclared (first use in this function)

src/os/unix/ngx_errno.c : 37 : 31 :note: each undeclared identifier is reported only once for

原因:

NGX_SYS_NERR未定义,NGX_SYS_NERR正常情况下应定义在objs/ngx_auto_config.h文件中,

特别注意,这是一个auto性质的文件,只有在执行了./configure后,才能生成这个文件。

宏NGX_SYS_NERR的意义为,在Linux系统中有132个错误编码。

解决:

找到ngx_auto_config.h这个文件(我的ngx_auto_config.h在build目录,

不同的configure参数,这个文件的位置可能不一样)

 

3.8    /src/os/unix/ngx_time.h

3.9    without-http_rewrite_module和使用pcre冲突

 

3.10  nginx的编译脚本

 

 

php编译

1.     php编译脚本

      
2.     依赖库libxml2 (可选)
     
3.     依赖库libconv(可选)
4.     依赖库openssl (可选)

openssl_random_pseudo_bytes需要openssl支持

5.     php编译成功
      

四. 运行

1.     运行错误

留下脚印,证明你来过。

*

*

流汗坏笑撇嘴大兵流泪发呆抠鼻吓到偷笑得意呲牙亲亲疑问调皮可爱白眼难过愤怒惊讶鼓掌
关闭