您的位置:首页 > 运维架构 > Nginx

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

编译

目录
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: