您现在的位置是:首页 >其他 >windows11下配置visual studio 2022 nginx工程网站首页其他
windows11下配置visual studio 2022 nginx工程
windows11下配置visual studio 2022 nginx工程
参考文档:
准备工具:
-
官方文档要求准备的工具:
- Visual Studio
- MSYS或者MSYS2
- ActivePerl 或者 Strawberry Perl.
- Mercurial client.---- 可以不需要
- pcre,zlib和openssl
-
ngnix 源码:Tags · nginx/nginx (github.com)
随便选择一个release版本,分别有压缩宝zip和tar.gz,选一个就行。
-
Strawberry Per:Strawberry Perl for Windows
-
MSYS2: https://www.msys2.org/.
-
三个依赖包源码:
-
tip:
-
本文选择版本:
- nginx-release-1.23.3
- zlib-1.2.13
- pcre2-10.42
- openssl-3.1.0
-
环境变量配置:
-
visual studio
- nmake 64位环境:
- IDE环境:
- Buid环境:
-
Strawberry
-
安装时会默认配置环境,有三个不同的环境变量。
需要注意的时,需要在编译nginx之前安装完,不然在编译的时候会报perl的错误,好像是因为msys中也有个perl
-
-
msys
- 需要手动添加目录msys64usrin的sed.exe环境
-
-
编译nginx:
准备工作:
- 先解压nginx文件,并在根目录创建objs文件
- 在objs文件中创建lib文件,再将解压的三个依赖包(openssl、pcre2、zlib)添加到lib文件中。
-
打开msys2 msys
-
通过cd命令进入nginx-rlease-1.23.3命令 , 上面的1.23.2只是用来举例子
- cd …放回上一级
- cd d: 进d盘等
-
msys2在nginx根目录下执行下面指令,生成makefile文件 :
需要注意lib文件的版本号要对应,或者将lib文件中依赖包文件名的版本号去掉,在配置代码中都要一一对应。
auto/configure --with-cc=cl --with-debug --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 --http-scgi-temp-path=temp/scgi_temp --http-uwsgi-temp-path=temp/uwsgi_temp --with-cc-opt=-DFD_SETSIZE=1024 --with-pcre=objs/lib/pcre2-10.42 --with-zlib=objs/lib/zlib-1.2.13 --with-openssl=objs/lib/openssl-3.10 --with-openssl-opt=no-asm --with-http_ssl_module
-
指令正常执行,会呈现如下代码:
# auto/configure --with-cc=cl --with-debug --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 --http-scgi-temp-path=temp/scgi_temp --http-uwsgi-temp-path=temp/uwsgi_temp --with-cc-opt=-DFD_SETSIZE=1024 --with-pcre=objs/lib/pcre2-10.40 --with-zlib=objs/lib/zlib-1.2.11 --with-openssl=objs/lib/openssl-1.1.1m --with-openssl-opt=no-asm --with-http_ssl_module checking for OS // tip: 这里可能会出现报错: // auto/cc/msvc: line 117: [: : integer expression expected // 这个时候就需要去nginx根目录/auto/cc/msvc 16行的样子 // 添加 NGX_MSVC_VER=19.34 + MSYS_NT-10.0-19044 3.3.5-341.x86_64 x86_64 + using Microsoft Visual C++ compiler + cl version: 19.32.31332 for x64 checking for MSYS_NT-10.0-19044 specific features creating objs/Makefile Configuration summary + using PCRE2 library: objs/lib/pcre2-10.40 + using OpenSSL library: objs/lib/openssl-1.1.1m + using zlib library: objs/lib/zlib-1.2.11 nginx path prefix: "" nginx binary file: "/nginx.exe" nginx modules path: "/modules" nginx configuration prefix: "/conf" nginx configuration file: "/conf/nginx.conf" nginx pid file: "/logs/nginx.pid" nginx error log file: "/logs/error.log" nginx http access log file: "/logs/access.log" nginx http client request body temporary files: "temp/client_body_temp" nginx http proxy temporary files: "temp/proxy_temp" nginx http fastcgi temporary files: "temp/fastcgi_temp" nginx http uwsgi temporary files: "temp/uwsgi_temp" nginx http scgi temporary files: "temp/scgi_temp"
-
-
打开VS对应的 X64 Native Tools Command … for VS 2022
,一般可以在开始菜单中的VS目录下找- cd进入nginx根目录 输入命令:
nmake -f objs/Makefile
。 - 等待编译成功,会有好几分钟一直跳代码。
- 编译成功:nginx.exe 会出现在objs目录下,且会和ngx_auto_config.h、ngx_auto_headers.h、ngx_modules.c、ngx_pch.c在objs中。
- cd进入nginx根目录 输入命令:
-
windows编译nginx的过程可能会出现的问题:
- -bash: auto/configure: No such file or directory – 文件名错了,或者路径错了,或者包资源不全,需要重新下载。
- auto/cc/msvc: line 117: [: : integer expression expected ----这个可以在 auto/cc/msvc 的第 16 行增加 NGX_MSVC_VER=19.34
- 和perl有关的问题,可能是与msys中的perl混了,所以需要在编译前就把草莓perl安装好,且设置好环境变量。
- 需要64位nmake指令,就需要将对应的文件目录加入环境变量。
创建VS2022工程:
准备工作:
- 需要创建一个控制台工程,且工程位置在nginx根目录中
- 勾选 solution和project在统一目录中,create
- 可以移除,Source Files、Header Files、Resource Files,只保留External Dependencies
-
创建完之后,nginx根目录下会出现方案solution的文件,我们这里是nginx_test
-
将文件nginx_test目录中的.sln文件、.vcxproj文件、.filters文件复制到根目录下,再删除 nginx_test文件夹。再用vs打开.sln方案文件。
-
在工程中创建和根目录中src里面的文件夹一样的目录层级,每个对应的子文件都要创建:
tip: unix文件中的文件不要拷贝,因为这些文件不是windows下运行需要的
-
修改目标工程属性:
-
将编译后(还未编译)的目标输出文件修改为 .bin/nginx.exe ,有两个地方需要修改:
-
编译可能出现的问题:
-
编译前需要的准备工作,配置工程(project, 不是solution)的属性:
- 头文件路径 Properties > VC + Directories > Include Directories ,为了保证对应的.c有对应的.h文件,一般是缺什么头文件补什么路径
- 不会去水印,被挡住的是:
.srceventmodules
- 不会去水印,被挡住的是:
- 库目录 Properties > VC + Directories > Library Directories — 这个是根据哪个文件下有lib包进行的路径
- 依赖项 Properties > Linker > Input > Additional Dependencies ----前面四lib是三个依赖包中的,后面的是参考文档中的,被水印挡住的是 crypt32.lib
- 宏定义 Properties > PreProcessor > PreProcessor Definition ---- 被挡住的是 FD_SETSIZE = 1014
- 头文件路径 Properties > VC + Directories > Include Directories ,为了保证对应的.c有对应的.h文件,一般是缺什么头文件补什么路径
-
头文件没包含,即找不到头文件 ,若找不到头文件,需要添加对应头文件目录
- 报错:例如:fatal c1083: cannot open inlcude file:”xxxx.h“:No such file or directory
-
.c文件错误,整个是因为这些文件不是windows运行下需要的,所以可以删除:
-
需要删除的文件有如下:看着删,错什么.c,删什么,其中ngx_event_connectex.c好像不需要删(最后报链接错误的时候补回来了)
-
-
LNK链接错误有两种,文件对象都是.obj:
-
一种是少了依赖包,少了依赖包的在上面依赖包添加已经完成
-
一种是少了相应的.h文件和.c文件
-
unresolved external symbol ngx_modules 和 unresolved external symbol ngx_modules_name的错误
他们的文件对象是ngx_module.obj,在objs文件下,所以在VS工程文件中创建一个objs文件,并将相应的头文件和c文件拷贝进来:
-
若是报错:
ngx_google_perftools_module.obj : error LNK2019: unresolved external symbol ProfilerStart referenced in function ngx_google_perftools_worker 1>ngx_google_perftools_module.obj : error LNK2019: unresolved external symbol ProfilerStop referenced in function ngx_google_perftools_worker 1>ngx_google_perftools_module.obj : error LNK2019: unresolved external symbol ProfilerRegisterThread referenced in function ngx_google_perftools_worker
- 则删除工程中的misc/ngx_google_perftools_module.c 文件
-
-
编译后出现命令行可能出现的警告:
-
nginx: [alert] could not open error log file: CreateFile() "logs/error.log"和nginx: [emerg] CreateDirectory() “E: 03- SourceCodeNginxDone ginx-release-1.23.2/temp/client_body_temp” failed (3: The system cannot find the path specified)
-
需要在bin目录下创建,logs文件价和temp文件夹,此外还需要将根目录下的conf文件加入到bin文件中,还有docs/html文件也要加入到bin文件中。
-
这个时候,需要将VS工程属性中的工作目录改为bin目录,再设置对应的命令参数:
-
若在运行的命令行中出现:
- nginx: [emerg] CreateFile() “C/conf/nginx.conf” failed (3: The system cannot find )
- 则需要修改字符字符集:Properties > Advanced > Advanced Properties - > Character Set > USE Multi-Byte Character Set
-
-
运行nginx工程:
- 在visual studio中运行。
- 在浏览器中输入http://127.0.0.1,即可看到如下界面,即完成。
- 为了保证vs中nginx的单进程,则需要在bin/conf/nginx.conf文件中配置
- 最后就可在VS中调式nginx工程了!
- 若有错误和疑问欢迎讨论!