window编译nginx过程以及安装nginx_mod_h264_streaming插件

window中编译nginx的过程中遇到了各种问题,记录一下
ps:nginx_mod_h264_streaming-2.2.7 window系统编译中出现各种问题,所以换成2.2.5折腾了下
如果使用1.18之后的windows版本的nginx,是不需要加入nginx_mod_h264_streaming的,因为提供的默认模块已经包含。

准备工作

1.需要准备vs库,建议下载vs2013,因为vs2013之后基础库的引入方式发生了改变,会导致编译老版本的openSSL报错。
ps:当时从2019 折腾到2015 又折腾到2013,终于把ssl编译成功了
2.openSSL要使用1.0.1e,试了1.0.2e水土不服,就没有再试更高版本的。
3.必装软件清单:
vs2013~ 如果已有vs2010也可以 vs6.0不行
Mercurial 一个分布式的版本管理,用来下载nginx代码
MSYS gun环境
ActivePerl perl脚本执行器
openssl+pcre+zlib nginx必要的类库

已经打包的资源 不包含vs环境
点我下载

4.特殊配置:
安装完MSYS ,需要将MSYS的lib配置到环境变量中,以实现sed等命令
还有配置Mercurial 以实现随处clone代码
在这里插入图片描述
PS:环境变量配置完之后,需要重启电脑才能生效

开始干活

1.先clone下代码

选择一个硬盘的风水宝地,使用cmd执行命令

d:
# 注意此条命令,如果无法执行,检查是否多复制了空格
hg clone http://hg.nginx.org/nginx

在这里插入图片描述

2.代码down下之后,进入nginx目录

建立objs /lib 目录 并将途中的4个包放入该目录,解压到当前目录即可。
ps:注意解压出现的双层目录,可能导致之后配置出现问题。

在这里插入图片描述

3.创建编译命令批文件

建立一个build.bat
里面的内容如下:

auto/configure --with-cc=cl --builddir=objs --prefix= \
--conf-path=conf/nginx.conf --pid-path=logs/nginx.pid \
--http-log-path=logs/access.log --error-log-path=logs/error.log \
--sbin-path=nginx.exe --http-client-body-temp-path=temp/client_body_temp \
--http-proxy-temp-path=temp/proxy_temp \
--http-fastcgi-temp-path=temp/fastcgi_temp \
--with-cc-opt=-DFD_SETSIZE=1024 --with-pcre=objs/lib/pcre-8.39 \
--with-zlib=objs/lib/zlib-1.2.11 --with-openssl=objs/lib/openssl-1.0.1e \
--with-select_module --with-http_ssl_module --with-http_realip_module \
--with-http_v2_module --with-http_mp4_module --with-http_flv_module \
--with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module \
--with-http_random_index_module --with-http_secure_link_module --with-http_slice_module \
--with-mail --with-stream --with-http_ssl_module --with-mail_ssl_module --with-stream_ssl_module \
--add-module=objs/lib/nginx_mod_h264_streaming-2.2.5

在这里插入图片描述

4.然后打开安装好的msys

在这里插入图片描述
也是一个黑框 执行

#与cmd指定路径稍微有些不同,盘符使用/d/代替 d盘
cd /d/nginx
build.bat

在这里插入图片描述
此时已经生成了makefile 然后通过vs命令行进行代码执行

在这里插入图片描述
请使用管理员权限进行运行
在这里插入图片描述
输入执行以下命令

d:
cd nginx
nmake -f objs/Makefile

等待编译完成即可
在这里插入图片描述
这个sed就是上面要配置MSYS环境变量的原因

5.编译完之后 大体是这样的

在这里插入图片描述

这个时候我们直接点击nginx 会发现无法运行
但是此时也没有任何日志,可以利用系统的事件查看器来定位执行问题,
一些其他app的闪退也可以如此查询原因
在这里插入图片描述
如此 问题原因就找到了
在这里插入图片描述
需要建立一些文件夹
在objs下建立logs 然后再次启动nginx 如果有异常就会输入到错误日志中,后续根据错误日志 我们至少需要建立
在这里插入图片描述
/conf/nginx.conf
可以将d:/nginx/conf 复制到d:/nginx/objs/conf

在建立/temp 理论就可以跑起来了,如果还有问题,请根据errorlog进行查询
最后建立的文件夹如下
在这里插入图片描述

在这里插入图片描述
执行nginx -V 看一眼编译进去的模块
在这里插入图片描述

一些问题以及相应解决办法

这些问题均为使用nginx_mod_h264_streaming插件所导致,但是也为安装其他插件如果出现类似问题,提供一些解决思路
问题1:
error C2220: 警告被视为错误 - 没有生成“object”文件
在这里插入图片描述

解决:
修改markfile编译中的警告视为错误
在这里插入图片描述
将-WX 修改为-WX- 其中-WX为警告视为错误,-WX-为警告不会阻断编译

问题2:
objs/lib/nginx_mod_h264_streaming-2.2.5/src/ngx_http_h264_streaming_module.c(4) : fatal error C1010: 在查找预编译头时遇 到意外的文件结尾。是否忘记了向源中添加“#include “ngx_config.h””?

解决:
遇到此种类找预编译头时遇 到意外的文件结尾都可以根据代码提示,进入markfile中 搜索ngx_http_h264_streaming_module
删除红框里的字符串后继续编译
在这里插入图片描述
ps:针对nginx_mod_h264_streaming要删除 以下模块中的-Yungx_config.h -Fpobjs/ngx_config.pch
ngx_http_h264_streaming_module
moov.obj
mp4_io.obj
mp4_reader.obj
mp4_writer.obj
output_bucket.obj
output_mp4.obj

问题3:
ngx_http_streaming_module.c(158) : error C2039: “zero_in_uri”: 不是“ngx_http_request_s”的成员
D:\nginx\src\http\ngx_http_request.h(371) : 参见“ngx_http_request_s”的声明

解决办法:

在这里插入图片描述
问题4:
mp4_io.obj : error LNK2019: 无法解析的外部符号 _ftello,该符号在函数 _mp4_atom_read_header 中被引用
mp4_io.obj : error LNK2019: 无法解析的外部符号 _fseeko,该符号在函数 _mp4_open 中被引用
output_mp4.obj : error LNK2001: 无法解析的外部符号 _fseeko

解决办法:
将所有的宏定义替换成对应的函数
在这里插入图片描述
搜索代码中的ftello 替换为 _ftelli64
将代码中的fseeko 替换为_fseeki64
涉及的文件有 mp4_io.c output_mp4.c

问题5:
如果使用其他版本的nginx_mod_h264_streaming 比如2.2.7 可能会出现此种问题
fatal error C1083: 无法打开包括文件: “unistd.h”
fatal error C1083: 无法打开包括文件: “sys/mman.h”

在这里插入图片描述
在这里插入图片描述
解决办法:
挺诧异的,因为看代码引入的时候也是指明为win32的时候不引入。所以当时换用了2.2.5版本的代码
在这里插入图片描述
应该是宏失效了,但是此处如果判断有误,后续代码中的判断均异常,改起来太麻烦,所以放弃挣扎了选了 个2.2.5凑合跑起来看看。

求助,为什么在Windows系统下#ifdef _WINDOWS 不生效?

问题6:
出现类似的问题,可能是按网络上找到了window版本的mman.h

objs/lib/nginx_mod_h264_streaming-2.2.7/src/mp4_io.c(202) : error C2065: “SYSTEM_INFO”: 未声明的标识符
objs/lib/nginx_mod_h264_streaming-2.2.7/src/mp4_io.c(202) : error C2146: 语法错误: 缺少“;”(在标识符“SysInfo”的前面)
objs/lib/nginx_mod_h264_streaming-2.2.7/src/mp4_io.c(202) : error C2065: “SysInfo”: 未声明的标识符
objs/lib/nginx_mod_h264_streaming-2.2.7/src/mp4_io.c(203) : warning C4013: “GetSystemInfo”未定义;假设外部返回 int
objs/lib/nginx_mod_h264_streaming-2.2.7/src/mp4_io.c(203) : error C2065: “SysInfo”: 未声明的标识符
objs/lib/nginx_mod_h264_streaming-2.2.7/src/mp4_io.c(204) : error C2065: “SysInfo”: 未声明的标识符
objs/lib/nginx_mod_h264_streaming-2.2.7/src/mp4_io.c(204) : error C2224: “.dwAllocationGranularity”的左侧必须具有结构/联合类型
objs/lib/nginx_mod_h264_streaming-2.2.7/src/mp4_io.c(204) : warning C4033: “alignment”必须返回值
objs/lib/nginx_mod_h264_streaming-2.2.7/src/mp4_io.c(250) : warning C4013: “truncate”未定义;假设外部返回 int
objs/lib/nginx_mod_h264_streaming-2.2.7/src/mp4_io.c(262) : warning C4244: “函数”: 从“uint64_t”转换到“long”,可能丢失数据
objs/lib/nginx_mod_h264_streaming-2.2.7/src/mp4_io.c(275) : error C2065: “HANDLE”: 未声明的标识符
objs/lib/nginx_mod_h264_streaming-2.2.7/src/mp4_io.c(275) : error C2146: 语法错误: 缺少“;”(在标识符“hFile”的前面)
objs/lib/nginx_mod_h264_streaming-2.2.7/src/mp4_io.c(275) : error C2065: “hFile”: 未声明的标识符
objs/lib/nginx_mod_h264_streaming-2.2.7/src/mp4_io.c(275) : error C2146: 语法错误: 缺少“;”(在标识符“_get_osfhandle”的前面)
objs/lib/nginx_mod_h264_streaming-2.2.7/src/mp4_io.c(277) : error C2065: “hFile”: 未声明的标识符
objs/lib/nginx_mod_h264_streaming-2.2.7/src/mp4_io.c(284) : error C2039: “fileMapHandle_”: 不是“mem_range_t”的成员
        d:\nginx\objs\lib\nginx_mod_h264_streaming-2.2.7\src\mp4_io.h(87) : 参见“mem_range_t”的声明
objs/lib/nginx_mod_h264_streaming-2.2.7/src/mp4_io.c(284) : warning C4013: “CreateFileMapping”未定义;假设外部返回 int
objs/lib/nginx_mod_h264_streaming-2.2.7/src/mp4_io.c(284) : error C2065: “hFile”: 未声明的标识符
objs/lib/nginx_mod_h264_streaming-2.2.7/src/mp4_io.c(285) : error C2065: “PAGE_READONLY”: 未声明的标识符
objs/lib/nginx_mod_h264_streaming-2.2.7/src/mp4_io.c(285) : error C2065: “PAGE_READWRITE”: 未声明的标识符
objs/lib/nginx_mod_h264_streaming-2.2.7/src/mp4_io.c(287) : error C2039: “fileMapHandle_”: 不是“mem_range_t”的成员
        d:\nginx\objs\lib\nginx_mod_h264_streaming-2.2.7\src\mp4_io.h(87) : 参见“mem_range_t”的声明
objs/lib/nginx_mod_h264_streaming-2.2.7/src/mp4_io.c(385) : warning C4244: “函数”: 从“uint64_t”转换到“size_t”,可能丢失数据
objs/lib/nginx_mod_h264_streaming-2.2.7/src/mp4_io.c(388) : warning C4244: “函数”: 从“uint64_t”转换到“size_t”,可能丢失数据
objs/lib/nginx_mod_h264_streaming-2.2.7/src/mp4_io.c(388) : warning C4244: “函数”: 从“uint64_t”转换到“off_t”,可能丢失数据
objs/lib/nginx_mod_h264_streaming-2.2.7/src/mp4_io.c(397) : warning C4013: “madvise”未定义;假设外部返回 int
objs/lib/nginx_mod_h264_streaming-2.2.7/src/mp4_io.c(397) : error C2065: “MADV_SEQUENTIAL”: 未声明的标识符
objs/lib/nginx_mod_h264_streaming-2.2.7/src/mp4_io.c(424) : warning C4244: “函数”: 从“uint64_t”转换到“size_t”,可能丢失数据
objs/lib/nginx_mod_h264_streaming-2.2.7/src/mp4_io.c(441) : warning C4013: “ftello”未定义;假设外部返回 int
objs/lib/nginx_mod_h264_streaming-2.2.7/src/mp4_io.c(508) : warning C4013: “fseeko”未定义;假设外部返回 int
NMAKE : fatal error U1077: “"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\BIN\cl.EXE"”: 返回代码“0x2”

暂无解决办法

参考:
Windows编译Nginx源码

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值