> 技术文档 > nginx交叉编译arm32运行rv1126并添加http_ssl_module、文件上传nginx-upload-module、rtsp推流nginx-http-flv-module_nginx 交叉编译 openssl

nginx交叉编译arm32运行rv1126并添加http_ssl_module、文件上传nginx-upload-module、rtsp推流nginx-http-flv-module_nginx 交叉编译 openssl


背景:

rv1126需要实现rtsp推流,还需要实现http_post请求来上传比较大的文件
nginx非常适合就着手进行移值,过程中发现坑太多了,做个笔记记录下过程。

环境

编译环境:ubuntu20.04_x86_64
运行环境:RV1126_ARM32
交叉工具编译链绝对路径参考:

/home/pi/atk/rv1126/atk-rv1126_sdk_v1.5_20240201/prebuilts/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin

源码绝对路径参考全部放在:

/home/pi/atk/rv1126/app/aiotgw-app/api

编译步骤概括

1、交叉编译openssl
2、交叉编译pcre
3、交叉编译zlib
4、交叉编译nginx


交叉编译openssl测试源码可用:

https://openssl-library.org/source/old/1.1.1/
本次下载 openssl-1.1.1k.tar.gz

tar zxvf openssl-1.1.1k.tar.gz && cd openssl-1.1.1k # 解压缩./config no-asm shared --prefix=$PWD/__install --cross-compile-prefix=/home/pi/atk/rv1126/atk-rv1126_sdk_v1.5_20240201/prebuilts/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf- make # 编译

报错 -m64 错误,修改 openssl根目录下的

vim Makefile # 修改Makefile 去除编译和链接选项 -m64(一共有2处)

nginx交叉编译arm32运行rv1126并添加http_ssl_module、文件上传nginx-upload-module、rtsp推流nginx-http-flv-module_nginx 交叉编译 openssl
继续make,完成openssl的编译测试。


交叉编译proc测试源码可用:

https://sourceforge.net/projects/pcre/files/pcre/8.45/pcre-8.45.tar.bz2/download
本次下载 pcre-8.36.tar.gz

tar -zxvf pcre-8.36.tar.gz # 解压缩export PATH=\"/home/pi/atk/rv1126/atk-rv1126_sdk_v1.5_20240201/prebuilts/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/:$PATH\"./configure --prefix=`pwd`/__install \\--host=arm-linux-gnueabih \\CC=arm-linux-gnueabihf-gcc \\CXX=arm-linux-gnueabihf-g++make # 完成编译

完成proc的编译测试。

交叉编译zlib测试源码可用:

https://github.com/madler/zlib
本次下载 zlib-1.2.13

tar zxvf zlib-1.2.13 && cd zlib-1.2.11 # 解压缩export PATH=\"/home/pi/atk/rv1126/atk-rv1126_sdk_v1.5_20240201/prebuilts/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/:$PATH\"export ARCH=armexport CROSS_COMPILE=/home/pi/atk/rv1126/atk-rv1126_sdk_v1.5_20240201/prebuilts/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-export CC=/home/pi/atk/rv1126/atk-rv1126_sdk_v1.5_20240201/prebuilts/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc./configure --prefix=$PWD/_installmake # 编译

完成zlib的编译测试。


交叉编译nginx

http://nginx.org/download/ # 当前下载最新1.28.0
nginx-1.28.0.tar.gz

第一次编译,先不添加openssl,确定基础可以编译通过

tar jxvf nginx-1.28.0.tar.gz && cd nginx-1.28.0# 注意configure指定的pcre zlib openssl 都是源码目录,不是编译后的安装目录./configure --prefix=`pwd`/__install --crossbuild=Linux::arm \\--with-cc=/home/pi/atk/rv1126/atk-rv1126_sdk_v1.5_20240201/prebuilts/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc \\--with-cpp=/home/pi/atk/rv1126/atk-rv1126_sdk_v1.5_20240201/prebuilts/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-cpp \\--with-pcre=/home/pi/atk/rv1126/app/aiotgw-app/api/pcre-8.45 \\--with-zlib=/home/pi/atk/rv1126/app/aiotgw-app/api/zlib-1.2.13 \\--without-http_upstream_zone_modulemake # 编译

报错1 找不到交叉编译器,编译器报错 ./configure error : C compiler gcc is not found

vim auto/cc/name # 文件,将21行的“exit 1” 注释掉++++++++ if [ $ngx_found = no ]; then echo echo $0: error: C compiler $CC is not found echo # exit 1 # 注释掉 fi++++++++

报错2 ./configure : error:can not detect int size

vim auto/types/sizeof # 文件,修改++++++++# ngx_test=\"$CC $CC_TEST_FLAGS $CC_AUX_FLAGS -o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_LD_OPT $ngx_feature_libs\"ngx_test=\"gcc $CC_TEST_FLAGS $CC_AUX_FLAGS -o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_LD_OPT $ngx_feature_libs\"++++++++

报错3 PCRE无法编译

vim auto/options # 文件,修改++++++++# PCRE_CONF_OPT= # 增加交叉编译参数PCRE_CONF_OPT=--host=arm-linux-gnueabih CC=arm-linux-gnueabihf-gcc++++++++

报错4 src/core/ngx_config.h:92:30: 错误: overflow in conversion from ‘long long int’

vim auto/options # 文件,修改++++++++int main(void) { //printf(\"%d\", (int) sizeof($ngx_type)); # 删除这行,改为下面的 printf(\"%d\", 4); return 0;}++++++++

报错5 src/core/ngx_rwlock.c:125:2: error: #error ngx_atomic_cmp_set() is not defined!

++++++++# configure的时候加上,关闭宏NGX_HTTP_UPSTREAM_ZONE--without-http_upstream_zone_module # 必须加++++++++

报错6 NGX_HAVE_SYSVSHM宏没有生效

src/core/ngx_cycle.c:701: undefined reference to `ngx_shm_free\'src/core/ngx_cycle.c:701: undefined reference to `ngx_shm_free\'src/core/ngx_cycle.c:918: undefined reference to `ngx_shm_free\'src/event/ngx_event.o: in function `ngx_event_module_init\':src/event/ngx_event.c:574: undefined reference to `ngx_shm_alloc\'# 因为NGX_HAVE_SYSVSHM宏没有生效# 处理方法如下vim auto/unix # 修改文件+++++++++++ngx_feature=\"System V shared memory\"ngx_feature_name=\"NGX_HAVE_SYSVSHM\"# ngx_feature_run=yes # 约882行,改为nongx_feature_run=no+++++++++++

#以上6个错误全部处理完成后继续
make # 此时可正常编译完成。

第二次编译,添加openssl

和一次次编译比,增加了后面两条关于openssl的内容

./configure --prefix=`pwd`/__install --crossbuild=Linux::arm \\--with-cc=/home/pi/atk/rv1126/atk-rv1126_sdk_v1.5_20240201/prebuilts/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc \\--with-cpp=/home/pi/atk/rv1126/atk-rv1126_sdk_v1.5_20240201/prebuilts/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-cpp \\--with-pcre=/home/pi/atk/rv1126/app/aiotgw-app/api/pcre-8.45 \\--with-zlib=/home/pi/atk/rv1126/app/aiotgw-app/api/zlib-1.2.13 \\--without-http_upstream_zone_module \\--with-openssl=/home/pi/atk/rv1126/app/aiotgw-app/api/openssl-1.1.1k \\--with-http_ssl_modulemake # 编译

报错7 libssl.a: error adding symbols: file format not recognized
编译调用了x86的gcc

# 参考ssl的编译配置 ./config no-asm shared --prefix=$PWD/__install --cross-compile-prefix=/home/pi/atk/rv1126/atk-rv1126_sdk_v1.5_20240201/prebuilts/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-vim auto/lib/openssl/make # 修改文件+++++++++++++$OPENSSL/.openssl/include/openssl/ssl.h: $NGX_MAKEFILE cd $OPENSSL \\\\ && if [ -f Makefile ]; then \\$(MAKE) clean; fi \\\\ # && ./config --prefix=$ngx_prefix no-shared no-threads $OPENSSL_OPT \\\\ # 改为下面的,加上交叉编译器的前缀 && ./config --prefix=$ngx_prefix no-shared no-threads --cross-compile-prefix=/home/pi/atk/rv1126/atk-rv1126_sdk_v1.5_20240201/prebuilts/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf- \\\\ && \\$(MAKE) \\\\ && \\$(MAKE) install_sw LIBDIR=lib+++++++++++++

报错8 openssl模块 报错8 openssl 编译 -m64无法删除错误

这个错误很经典,openssl编译也遇到过,解决方法是修改 openssl的Makefile文件删除两处的 -m64。
但是直接删除是不行的,因为每次make都会重新生成-m64,需要投机取巧,方法如下。

cd ../openssl-1.1.1k/ # 进入openssl目录mkdir .openssl # 创建文件夹,这个很关键,因为nginx指定了这个文件夹,注意config也修改了生成目录./config no-asm shared --prefix=$PWD/.openssl --cross-compile-prefix=/home/pi/atk/rv1126/atk-rv1126_sdk_v1.5_20240201/prebuilts/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf- # 此时修改Makefile 删除两处 -m64 ,参考前面的openssl编译make # 继续完成openssl的编译。# 确认编译成功后,返回nginx继续make,此时可以顺利make了

报错9 threads_pthread.c:(.text+0x5c): undefined reference to `pthread_rwlock_init’
编译完成,链接时候报错了,找不到线程处理函数

vim objs/Makefile+++++++++++++ -ldl -lcrypt /home/pi/atk/rv1126/app/aiotgw-app/api/pcre-8.45/.libs/libpcre.a /home/pi/atk/rv1126/app/aiotgw-app/api/openssl-1.1.1k/.openssl/lib/libssl.a /home/pi/atk/rv1126/app/aiotgw-app/api/openssl-1.1.1k/.openssl/lib/libcrypto.a -ldl /home/pi/atk/rv1126/app/aiotgw-app/api/zlib-1.2.13/libz.a \\ -lpthread \\ # 大概374行添加线程处理的链接库 -Wl,-E+++++++++++++

至此,编译openssl完成了。

第三次编译,添加nginx-http-flv-module 和 nginx-upload-module模块

下载
https://github.com/winshining/nginx-http-flv-module/tree/v1.2.12 # 包涵了nginx-rtmp-module所有功能,无需另外安装rtmp模块
https://github.com/fdintino/nginx-upload-module/tree/2.3.0 # post上传文件模块
相比第二次编译,添加了nginx-http-flv-module 和 nginx-upload-module模块

mkdir module && cd module # nginx根目录创建文件夹,放入上面下载的模块unzip nginx-http-flv-module-1.2.12.zip # 解压缩unzip nginx-upload-module-2.3.0.zip # 解压缩./configure --prefix=`pwd`/__install --crossbuild=Linux::arm \\--with-cc=/home/pi/atk/rv1126/atk-rv1126_sdk_v1.5_20240201/prebuilts/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc \\--with-cpp=/home/pi/atk/rv1126/atk-rv1126_sdk_v1.5_20240201/prebuilts/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-cpp \\--with-pcre=/home/pi/atk/rv1126/app/aiotgw-app/api/pcre-8.45 \\--with-zlib=/home/pi/atk/rv1126/app/aiotgw-app/api/zlib-1.2.13 \\--without-http_upstream_zone_module \\--with-openssl=/home/pi/atk/rv1126/app/aiotgw-app/api/openssl-1.1.1k \\--with-http_ssl_module \\--add-module=module/nginx-http-flv-module-1.2.12 \\--add-module=module/nginx-upload-module-2.3.0make # 编译

遇到问题,同第二次编译,一样处理,注意openssl每次编译都要重复进行第二次编译的删除 -m64 操作,目前没找到更好的解决方法,那位大佬有好的解决方法,希望可以留言告诉我,万分感谢。