您现在的位置是:首页 >其他 >windows11下配置visual studio 2022 nginx工程网站首页其他

windows11下配置visual studio 2022 nginx工程

超哥的小迷弟 2023-06-08 12:00:02
简介windows11下配置visual studio 2022 nginx工程

windows11下配置visual studio 2022 nginx工程

参考文档:

  1. 官方文档:Building nginx on the Win32 platform with Visual C

  2. 参考文章1:Compile NGINX with Visual Studio - Stack Overflow

  3. 参考文章2:如何在 Visual Studio 编译调试 Windows 版本的 Nginx 源码? - 知乎 (zhihu.com)。

准备工具:

  • 官方文档要求准备的工具:

    • Visual Studio
    • MSYS或者MSYS2
    • ActivePerl 或者 Strawberry Perl.
    • Mercurial client.---- 可以不需要
    • pcre,zlib和openssl
  • ngnix 源码Tags · nginx/nginx (github.com)

    随便选择一个release版本,分别有压缩宝zip和tar.gz,选一个就行。

  • Strawberry PerStrawberry 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:

准备工作:

  1. 先解压nginx文件,并在根目录创建objs文件
  2. 在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中。
  • 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工程:

准备工作:

  1. 需要创建一个控制台工程,且工程位置在nginx根目录中
  2. 勾选 solution和project在统一目录中,create
  3. 可以移除,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

在这里插入图片描述

  • 头文件没包含,即找不到头文件 ,若找不到头文件,需要添加对应头文件目录

    • 报错:例如: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工程:

  1. 在visual studio中运行。
  2. 在浏览器中输入http://127.0.0.1,即可看到如下界面,即完成。

在这里插入图片描述

  1. 为了保证vs中nginx的单进程,则需要在bin/conf/nginx.conf文件中配置

在这里插入图片描述

  1. 最后就可在VS中调式nginx工程了!
  2. 若有错误和疑问欢迎讨论!
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。