Openwrt交叉编译nginx-1.8.0
2015-04-30 17:54
746 查看
Openwrt创建软件包
关于交叉编译环境的搭建,不通公司使用的交叉编译方式会有差距,所以这篇文章不会介绍。这篇文章只是为了把编译过程中出现的错误和解决办法记录下来,方便各位看客作为参考。Openwrt官网有一篇文章介绍如何创建软件包,可以先看Creating packages 这篇文章大致了解编译软件包需要的相关文件,主要是Makefile。Makefile和nginx.init
Nginx Makefile和nginx.init 这两个文件可以从我下面提到的网站是去下载,但是Makefile我做了一些修改。包括将Nginx设置为开机启动,同时将nginx.conf的默认配置文件修行了修改。Makefile,nginx.innit 和下面提到的patch,我放到CSDN的资源里面Openwrt Nginx交叉编译Makefile/nginx.init/patch。编译
Nginx对于交叉编译支持的不太好,所以在编译过程中碰到了太多问题,需要修改nginx1.8.0的源代码才能解决。我以patch文件的方式来说明我修改的地方以及此时碰到的编译错误:diff -uNr nginx-1.8.0/auto/cc/gcc nginx-1.8.0.new/auto/cc/gcc --- nginx-1.8.0/auto/cc/gcc 2015-04-21 22:11:59.000000000 +0800 +++ nginx-1.8.0.new/auto/cc/gcc 2015-04-30 14:46:02.244013767 +0800 @@ -173,7 +173,7 @@ # stop on warning -CFLAGS="$CFLAGS -Werror" +CFLAGS="$CFLAGS -DNGX_HAVE_SYSVSHM=1" # debug CFLAGS="$CFLAGS -g" #(解决的编译错误为: objs/src/core/ngx_cycle.o: In function `ngx_init_cycle': /home/cacti/cross-compile/sdk-comcerto-openwrt-c2k_5.3.0/build_dir/target-arm_v7-a_glibc-2.14.1_eabi/nginx-1.8.0/src/core/ngx_cycle.c:457: undefined reference to `ngx_shm_free' /home/cacti/cross-compile/sdk-comcerto-openwrt-c2k_5.3.0/build_dir/target-arm_v7-a_glibc-2.14.1_eabi/nginx-1.8.0/src/core/ngx_cycle.c:462: undefined reference to `ngx_shm_alloc' /home/cacti/cross-compile/sdk-comcerto-openwrt-c2k_5.3.0/build_dir/target-arm_v7-a_glibc-2.14.1_eabi/nginx-1.8.0/src/core/ngx_cycle.c:648: undefined reference to `ngx_shm_free' objs/src/event/ngx_event.o: In function `ngx_event_module_init': /home/cacti/cross-compile/sdk-comcerto-openwrt-c2k_5.3.0/build_dir/target-arm_v7-a_glibc-2.14.1_eabi/nginx-1.8.0/src/event/ngx_event.c:513: undefined reference to `ngx_shm_alloc', 这里解决了两个错误,还有一个是把警告当作error处理。而且你可以看下它的源码,就会发现ngx_shm_xx的定义在条件编译里面,所以这里得加编译参数) diff -uNr nginx-1.8.0/auto/cc/name nginx-1.8.0.new/auto/cc/name --- nginx-1.8.0/auto/cc/name 2015-04-21 22:11:59.000000000 +0800 +++ nginx-1.8.0.new/auto/cc/name 2015-04-30 14:46:02.244013767 +0800 @@ -18,7 +18,6 @@ echo echo $0: error: C compiler $CC is not found echo - exit 1 fi fi (#解决的编译错误为: building for Linux::arm checking for C compiler ... found but is not working ./configure: error: C compiler arm-openwrt-linux-gnueabi-gcc is not found diff -uNr nginx-1.8.0/auto/types/sizeof nginx-1.8.0.new/auto/types/sizeof) --- nginx-1.8.0/auto/types/sizeof 2015-04-21 22:11:59.000000000 +0800 +++ nginx-1.8.0.new/auto/types/sizeof 2015-04-30 14:46:02.240013767 +0800 @@ -12,7 +12,7 @@ END -ngx_size= +ngx_size=4 cat << END > $NGX_AUTOTEST.c @@ -33,7 +33,7 @@ END -ngx_test="$CC $CC_TEST_FLAGS $CC_AUX_FLAGS \ +ngx_test="$gcc $CC_TEST_FLAGS $CC_AUX_FLAGS \ -o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_LD_OPT $ngx_feature_libs" eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1" (#编译错误为: checking for int size ...objs/autotest: 1: objs/autotest: Syntax error: word unexpected (expecting ")") bytes ./configure: error: can not detect int size cat: objs/autotest.c: No such file or directory 注意给sizeof一个值,我的编译环境为64位,但运行openwrt的板子为32位的,所以这个地方必须是4。我最开始写的是8,也能编译功能,但是放到板子上面安装的时候,运行nginx时,总是提示:nginx: [emerg] "worker_processes" directive invalid number 。对于这个错误,左思右想,夜不能寐,始终无法理解,最开始以为是libpcre编译的有问题,可测试后也不对。最后灵光一闪想到可能是这个地方出现问题,重新编译后,再次安装,终于看到了久违的nginx启动了,顿时泪流满面啊!) diff -uNr nginx-1.8.0/conf/nginx.conf nginx-1.8.0.new/conf/nginx.conf --- nginx-1.8.0/conf/nginx.conf 2015-04-21 22:11:59.000000000 +0800 +++ nginx-1.8.0.new/conf/nginx.conf 2015-04-30 14:46:02.224013768 +0800 @@ -41,7 +41,7 @@ #access_log logs/host.access.log main; location / { - root html; + root /usr/nginx/html; index index.html index.htm; } diff -uNr nginx-1.8.0/nginx.init nginx-1.8.0.new/nginx.init --- nginx-1.8.0/nginx.init 1970-01-01 08:00:00.000000000 +0800 +++ nginx-1.8.0.new/nginx.init 2015-04-30 14:46:02.244013767 +0800 @@ -0,0 +1,23 @@ +#!/bin/sh /etc/rc.common +# Copyright (C) 2009 OpenWrt.org + +START=50 +NGINX_BIN=/usr/sbin/nginx + +start() { + [ ! -d /var/lib/nginx ] && mkdir -p /var/lib/nginx + $NGINX_BIN +} + +stop() { + $NGINX_BIN -s stop +} + +reload() { + $NGINX_BIN -s reload +} + +shutdown() { + $NGINX_BIN -s quit +} + diff -uNr nginx-1.8.0/src/os/unix/ngx_errno.c nginx-1.8.0.new/src/os/unix/ngx_errno.c --- nginx-1.8.0/src/os/unix/ngx_errno.c 2015-04-21 22:12:01.000000000 +0800 +++ nginx-1.8.0.new/src/os/unix/ngx_errno.c 2015-04-30 14:46:02.236013767 +0800 @@ -28,6 +28,10 @@ static ngx_str_t *ngx_sys_errlist; static ngx_str_t ngx_unknown_error = ngx_string("Unknown error"); +#ifndef NGX_SYS_NERR +#define NGX_SYS_NERR 135 +#endif + u_char * ngx_strerror(ngx_err_t err, u_char *errstr, size_t size) #(编译错误为: 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 each function it appears in src/os/unix/ngx_errno.c: In function 'ngx_strerror_init': src/os/unix/ngx_errno.c:58:11: error: 'NGX_SYS_NERR' undeclared (first use in this function) ) 这个地方我看到有人是在ngx_auto_config.h这个文件里面改,其实独行,但是因为这个文件是auto生成的,在最原始的tar包里面是没有的,所以我就直接在ngx_errno.c文件里面直接自已定义一个值。NGX_SYS_NERR指的是在linux系统下面有多少个错误编码,具体什么意思我也不太明白,有兴趣的可以网上找找相关介绍。
注意
Nginx依赖的软件包为libpcre,假如你的板子上面的openwrt还没有这个软包,你就得自己交叉编译,这个包的交叉编译比较简单,我没有碰到任何错误。
给大家openwrt提供的已有packages的网站,这个网站很不错,基本很多软件包它都有相关的Makefile,包是按照分类来识别的,比如Nginx是属于“Net”分类,所以你应该到那个目录下面去找,libpcre属于库,所以你应该到“libs”目录下面去找。这样我们就不用自己去写,而且有的时候也许只要修改Makefile中软件包的版本号就可以直接编译。上面的Nginx和libpcre都可以在这个网站上面找到它们的Makefile,所以建议大家直接拿过来使用,别傻傻的自己去写了(像刚才的我一样)。
Ok,终于完了,上面就是我编译Nginx-1.8.0遇到的所有编译问题。
我编译过程参考CSDN中另一篇博文nginx交叉编译 .
**CSDN可以使用MarkDown进行编辑,感觉排版真心不错哦。
目录
用[TOC]来生成目录:
Openwrt创建软件包
Makefile和nginxinit
编译
目录
相关文章推荐
- LNMP环境编译安装全过程(php-5.6.14、nginx-1.8.0、mysql-5.6.26)
- OPENWRT交叉编译之神州数码校园客户端实践
- openwrt 之 tcpdump交叉编译
- openwrt 安装交叉编译工具链(一)
- openwrt的交叉编译
- 编译安装nginx1.8.0
- Openwrt源码下载和交叉编译
- Openwrt 交叉编译HelloWord
- Ubuntu 14.10下源码编译安装Nginx 1.8.0
- ubuntu交叉编译试用于openwrt的i2c-tools
- openwrt 交叉编译花生壳
- OpenWrt搭建编译环境编译交叉编译工具
- 基于CentOS6.5环境之下的LNMP之编译安装Nginx1.8.0 stable(稳定版)
- Nginx和php安装及配置第一篇:编译安装nginx-1.8.0
- ubuntu12.04建立交叉编译环境开发openwrt
- OpenWrt 自学笔记(4)------交叉编译SQLite3
- openwrt交叉编译
- 交叉编译OpenWRT
- openwrt 问题六 搭建自己的交叉编译环境