交叉编译Nginx(修正版)

Nginx是个高性能的http和反向代理服务器,应用非常广泛,使用C语言编写,故可以将其交叉编译,然后放到arm平台上使用,这样Nginx就可以在嵌入式linux里大放光彩。下面就讲述如何交叉编译Nginx。
一 准备

交叉编译平台:ubuntu16.04 64位
目标平台:arm 32位 (对于64位操作方法也是类似)

下载以下文件用于交叉编译:

    gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi.tar.xz
    nginx-1.16.1.tar.gz
    openssl-1.1.1d.tar.gz
    pcre-8.43.zip
    zlib-1.2.11.tar.gz

对于交叉编译器,去linaro网站上去下载,版本不一定要求4.9.4,不要太旧就可以(尽量和交叉编译linux内核镜像的编译器一致)。如果目标板是64位,就选aarch64-linux-gnu去下载。


PS:上述文件也可以点击这里下载,nginx_related_免费高速下载|百度网盘-分享无限制

以上文件下载好后传到虚拟机里,然后分别解压

交叉编译Nginx(修正版)_第1张图片

二 设置交叉编译器

 

把交叉编译器解压到一个不需要root权限的地方,这样以后操作会方便很多,可以像上面那样,和nginx它们放在同一个地方。尽量保证不使用root权限去编译。

使用以下命令去修改/etc/bash.bashrc,
sudo vim /etc/bash.bashrc
打开后在最后一行添加以下内容,

export PATH=/home/work/work/nginx_related/gcc-linaro-4.9.4/bin:$PATH
export CC=arm-linux-gnueabi-gcc
export CXX=arm-linux-gnueabi-g++
export LD=arm-linux-gnueabi-ld
export AR=arm-linux-gnueabi-ar
export RANLIB=arm-linux-gnueabi-ranlib
export STRIP=arm-linux-gnueabi-strip

注意,第一个export要根据自己的交叉编译器的实际位置去添加,还有不要添加CROSS_COMPILE和ARCH,否则后面还要去修改设置。

添加ok后保存关闭,然后输入以下命令进行更新,
source /etc/bash.bashrc

接着在终端下输入命令arm-linux-gnueabi-gcc -v验证设置交叉编译器是否成功,如果成功会打印版本信息,如下

 

以上内容可以不用配置,如果用第三方交叉编译工具,直接解压指定文件夹解压即可,

然后下面使用的时候在临时中断,导出环境变量,或者执行环境配置脚本,自动将当前

$CC设置成交叉编译的gcc

正式开始!

三 配置nginx

nginx本身是不支持交叉编译的,所以需要对其进行一定的修改。主要按照如下步骤进行修改,

    进入nginx-1.16.1目录
    1 打开configure文件,注释掉已下三行语句,

交叉编译Nginx(修正版)_第2张图片

 2 打开auto/cc/conf,把82行的gcc修改为arm-linux-gnueabi-gcc

交叉编译Nginx(修正版)_第3张图片

    3 打开auto/types/sizeof,把ngx_size设置为4 (32位目标平台是4,64位的话是8),



   4 并把编译器的自检注释掉,使用#号进行注释
交叉编译Nginx(修正版)_第4张图片
    5 打开auto/feature,注释掉ngx自检,如下标红的行

交叉编译Nginx(修正版)_第5张图片

   6  打开src/os/unix/ngx_time.h,添加time.h头文件



    7 打开src/os/unix/ngx_errno.h,添加NGX_SYS_NERR的宏定义,



    8 打开src/event/ngx_event_accept.c,打开_GNU_SOURCE,使能accept4()

交叉编译Nginx(修正版)_第6张图片

    9 打开src/event/ngx_event_udp.c,把判断NGX_HAVE_INET6的地方都注释掉,下面是其中一处,我们用不到ipv6



    打开src/os/unix/ngx_udp_sendmsg_chain.c,把判断NGX_HAVE_INET6的地方都注释掉,和第9步一样

以上修改好后,在nginx-1.16.1目录下执行下面的命令进行配置,

./configure --prefix=/home/vmuser/install --with-pcre=../pcre-8.43 --with-openssl=../openssl-1.1.1d --with-zlib=../zlib-1.2.11

–prefix是用来指定Nginx的安装路径,注意要根据自己的实际情况来指定位置,尽量不要放到需要root权限的目录下。


四 实际测试不需要修改Nginx的Makefile,默认生成即可。

五 编译和安装

回到nginx-1.16.1目录下,然后执行make & make install进行整体编译和安装,ok后,可以在myNginx目录下看到如下内容,



在sbin下有nginx的elf文件,使用file命令查看其运行平台,



可以看出是ARM平台,此时,就可以把myNginx整个目录拷贝到目标板上去运行了。

你可能感兴趣的:(Linux,交叉编译)