初级代码游戏的专栏介绍与文章目录-CSDN博客
我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。
这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。
源码指引:github源码指引_初级代码游戏的博客-CSDN博客
nginx其实并未考虑在小型设备上运行,官网所提供的安装包并不包含任何32位系统的,configure也并未设计用来使用交叉编译工具链,不过经过一些修改还是可以的。
目录
一、下载源码
二、交叉编译工具链
三、configure
修改auto/feature
修改auto/cc/name
修改auto/types/size
四、make
修改源代码
一、下载源码
官网下载,我下的是当前的最新版nginx-1.27.2.tar.gz。
源码直接在ubuntu上解压缩或者windows上解压缩再ftp上传。
二、交叉编译工具链
我用的是arm官网提供的工具链,这个工具链解压缩之后是个目录,为了使用工具链需要设置环境变量:
export PATH=~/arm-gnu-toolchain-13.3.rel1-x86_64-arm-none-linux-gnueabihf/bin:$PATH
工具链的所有工具都带有“arm-none-linux-gnueabihf-”前缀。
会用这个工具链的话看一眼就明白了。
用别的交叉编译工具链应该差不多,整个用到的就是C编译器一个而已(ld用的是哪个?)。
三、configure
configure并非配置为交叉编译的,首先要把CC替换掉:
export CC=arm-none-linux-gnueabihf-gcc
也就是替换成交叉编译的编译器。如果是先解压后上传,需要修改configure的属性。
然后执行configure:
NGX_PLATFORM=linux;./configure
前面指定了一下平台,没有的话会识别当前平台,当前平台是linux x64,其实我估计差不多,看configure里面主要是区分win和unix/linux。
执行会报很多错,很多检查不能通过,一个原因是脚本不是面向交叉编译的,根据系统类型使用原来的编译器的名字,而不是刚才定义的CC,另一个原因是用编译一个小程序的方法来检查int是4字节还是8字节(也就区分是32位还是64位),而交叉编译出来的程序是无法运行的,所以就报错。
解决方案比较粗暴:直接修改。该用$CC的地方改成$CC,判断int长度的地方跳过检查直接返回结果。
修改auto/feature
直接跳过了检查。
修改auto/cc/name
注意前面增加的echo是没什么意义的,只有最后两行改$CC有意义。
修改auto/types/size
几乎删光了,就留下返回结果的两句就行了。
这两个问题解决了之后还会提示两个依赖的东西没有,可以通过参数跳过,所以最终的命令是这样的:
NGX_PLATFORM=linux;./configure --prefix=$HOME/nginx-install-arm32 --without-http_rewrite_module --without-http_gzip_module
也用参数指定了安装路径,方便最后打包交付。
最后看到这样的就是通过了:
Configuration summary+ PCRE library is not used+ OpenSSL library is not used+ zlib library is not usednginx path prefix: "/home/user/nginx-install-arm32"nginx binary file: "/home/user/nginx-install-arm32/sbin/nginx"nginx modules path: "/home/user/nginx-install-arm32/modules"nginx configuration prefix: "/home/user/nginx-install-arm32/conf"nginx configuration file: "/home/user/nginx-install-arm32/conf/nginx.conf"nginx pid file: "/home/user/nginx-install-arm32/logs/nginx.pid"nginx error log file: "/home/user/nginx-install-arm32/logs/error.log"nginx http access log file: "/home/user/nginx-install-arm32/logs/access.log"nginx http client request body temporary files: "client_body_temp"nginx http proxy temporary files: "proxy_temp"nginx http fastcgi temporary files: "fastcgi_temp"nginx http uwsgi temporary files: "uwsgi_temp"nginx http scgi temporary files: "scgi_temp"
四、make
make也没那么顺利,遇到几个宏不存在,幸好都是判断32位还是64位的,直接改代码删掉判断保留针对32位的代码即可。
修改源代码
几处修改都很相似,下面是第一个修改:
所有修改的文件是这些:
最后make install把结果输出即可。
输出目录下的sbin目录里面有可执行程序,用file检查文件格式是否是arm32。
user@vm-ubuntu:~$ cd nginx-install-arm32
user@vm-ubuntu:~/nginx-install-arm32$ ls -l
total 16
drwxrwxr-x 2 user user 4096 Oct 31 12:04 conf
drwxrwxr-x 2 user user 4096 Oct 31 12:04 html
drwxrwxr-x 2 user user 4096 Oct 31 12:04 logs
drwxrwxr-x 2 user user 4096 Oct 31 12:04 sbin
user@vm-ubuntu:~/nginx-install-arm32$ cd sbin
user@vm-ubuntu:~/nginx-install-arm32/sbin$ ls
nginx
user@vm-ubuntu:~/nginx-install-arm32/sbin$ file *
nginx: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 3.2.0, with debug_info, not stripped
user@vm-ubuntu:~/nginx-install-arm32/sbin$
“ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV)”,确实是arm32程序。
(这里是文档结束)