本项目已开源,地址:https://github.com/Car-eye-team/Car-eye-RTMP-server/tree/master/source/nginx_windows
昨天在Windows下编译了下nginx-1.12版本,过程比较蜿蜒,记录一下。
首先说下必备的工具及代码:
MSYS-1.0.11.exe,交叉环境,推荐安装版的,会自动配置好环境变量,最后我会提供下载地址,很小,安装包3M。
该工具的主要作用就是执行configure进行项目的配置,并会在nginx项目目录中生成build目录及相关子目录及几个代码文件跟Makefile文件,这些生成完之后就没用了,编译用的是VS2017的nmake工具。
准备好nginx,nginx-rtmp-module,pcre,zlib这四分代码,下载地址就没必要提供了,这时有人会说了还有openssl呢?的确是需要的,不过编译openssl需要perl环境,对我来说每多装一个程序都是一次考验,而且在官方提供静态库的情况下何苦自己找不痛快呢?openssl静态库及头文件最后一起提供下载地址,版本是OpenSSL-1_1_0h,好了,工具都准备好了,开工吧。
首先呢需要将nginx的配置文件修改下,在项目的auto\cc目录下,打开msvc文件,定位到83行左右吧,查找下面这部分代码:
# warnings
CFLAGS="$CFLAGS -W4"
# stop on warning
CFLAGS="$CFLAGS -WX"
将-W4参数改为-W3,否则编译的时候会报错通不过,此时不改在下面的Makefile说明里修改也可以,下面的-WX参数如果你不希望在编译报警时停下来的话可以将CFLAGS="$CFLAGS -WX"注释掉即可。
然后假设已经安装好了MSYS环境,这个是有桌面图标的,点击即可运行,进行nginx项目根目录下,运行以下命令进行项目配置文件的生成:
auto/configure --with-cc=cl --builddir=build --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=../pcre \
--with-zlib=../zlib --with-openssl=./include \
--with-select_module --with-http_ssl_module \
--with-http_sub_module \
--add-module=../nginx-rtmp-module
稍微解析下几个参数吧:
--builddir:后面跟的参数就是要生成Makefile及配置代码的目录,生成的中间obj文件都在该目录下的各个模块子目录中;
--with-pcre:后面就是pcre项目代码所在目录
--with-zlib:后面就是zlib项目代码所在目录
--with-openssl:后面跟的是openssl头文件所在目录,include目录中有子目录openssl,里面是头文件,一定要有子目录openssl,因为nginx代码中引用头文件的格式是#include "openssl/xxx.h"这样的方式;
--add-module:就是需要用的RTMP模块
网上其他配置是有ipv6参数的,我这个配置时提示不支持ipv6,我就给去掉了。
运行成功后就会在build目录下生成对应模块目录及Makefile文件,到这里MSYS这个工具的使命就完成了。
接下来呢不要急着进行Make,需要改下build目录下的Makefile文件,因为有些是Windows环境不支持的命令:
看前面几行有CFLAGS的配置,你在这里修改-W3跟-WX选项也一样,如果在开始的时候没有修改auto\cc\msvc文件的话
CFLAGS = -O2 -W3 -WX -nologo -MT -Zi -DFD_SETSIZE=1024 -DNO_SYS_TYPES_H
然后开始搜索openssl关键字,开几个头文件引用的是否正确,确保引用目录为存放openssl头文件的include目录;
然后找到build/nginx.exe:选项,找到选项最后的 kernel32.lib user32.lib advapi32.lib ws2_32.lib部分,在后面添加legacy_stdio_definitions.lib,否则编译会报错一些系统自带的函数找不到,添加./libs/openssl/libcrypto32MT.lib ./libs/openssl/libssl32MT.lib引用,因为CFLAGS用的选项是-MT,静态库对应用MT版本,截图:
然后还需要注释掉一部分配置代码,因为Windows下没有sed命令,虽然对编译结果没影响,但每次都报错失败也是不舒服的,既然不支持就注释掉吧:
manpage是生成说明文档,将调用manpage处也注释掉即可。
好了,现在就可以用VS2017的开发人员命令工具进行编译了,打开开发人员命令工具,进入到nginx项目目录,然后使用命令
nmake -f build/Makefile即可,nginx项目目录也有一个Makefile文件,可以无视。。。
编译到最后你会发现还是会有错误的,提示“无法解析的外部符号 ___iob_func 处理方法”,是的,没错,这是VS2015后对你的特殊优待,直接说答案吧,在build目录中生成的ngx_auto_config.h头文件里添加代码:
FILE* __cdecl __iob_func(unsigned i)
{
return __acrt_iob_func(i);
}
在#define NGX_CONFIGURE宏定义的下面一行添加即可,然后编辑如无意外的话就过了~!
资源包下载地址:https://download.csdn.net/download/xinxinsky/10331187
CSDN最低资源分是2分,没有0分选项了,只能帮你们到这里了。。。