当前位置: 首页 > news >正文

MinGW下编译nginx源码

为了研究nginx源码,笔者想编译调试一下nginx源码,由于nginx是使用configure脚本方式生成Makefile来编译的,MinGW中理论上也是可以的,但是直接在MinGW中编译nginx源码会出现找不到PCRE库以及zlib库的问题:

在这里插入图片描述

在这里插入图片描述
实际上MinGW中是有安装这两个库的:

在这里插入图片描述
在这里插入图片描述

在Linux下如果安装了这两个库,在运行auto/configure时,是完全没问题的,能够正确找到这两个库:
在这里插入图片描述

笔者经过研究,发现在查找PCRE库以及zlib库的脚本中都只对非win32平台进行了检测,win32平台没做检测。可以参见目前最新稳定版本nginx 1.26的源码,PCRE配置以及zlib配置。

只需要把条件判定去掉即可:

在这里插入图片描述

在这里插入图片描述

再运行:

 auto/configure --prefix= --with-cc=clang

在这里插入图片描述

如果要启用https,需要添加参数:--with-http_ssl_module,在MinGW中编译同样需要注释掉判断条件

如果要调试添加参数:--with-debug

在这里插入图片描述

生成好Makefile之后,就可以编译了:

make -j8

可以使用VSCode进行调试,以下是笔者的launch.json

{
  // 使用 IntelliSense 了解相关属性。
  // 悬停以查看现有属性的描述。
  // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "type": "lldb",
      "request": "launch",
      "name": "(lldb) 启动",
      "program": "${workspaceFolder}/objs/nginx.exe",
      "args": [],
      "cwd": "${workspaceFolder}",
      "env": {
        "PATH": "G:\\msys64\\mingw64\\bin"
      }
    },
    {
      "name": "(gdb) 启动",
      "type": "cppdbg",
      "request": "launch",
      "program": "${workspaceFolder}/objs/nginx.exe",
      "args": [],
      "stopAtEntry": false,
      "cwd": "${workspaceFolder}",
      "environment": [],
      "externalConsole": false,
      "MIMode": "gdb",
      "miDebuggerPath": "G:\\msys64\\mingw64\\bin\\gdb.exe",
      "setupCommands": [
        {
          "description": "为 gdb 启用整齐打印",
          "text": "-enable-pretty-printing",
          "ignoreFailures": true
        },
        {
          "description": "将反汇编风格设置为 Intel",
          "text": "-gdb-set disassembly-flavor intel",
          "ignoreFailures": true
        }
      ],
      "windows": {
        "environment": [
          {
            "name": "PATH",
            "value": "G:\\msys64\\mingw64\\bin"
          }
        ]
      }
    }
  ]
}

需要注意的是,由于nginx默认是使用的多进程模式,如果直接调试,将无法调试工作进程的情况,为此需要在调试时改为单进程的运行方式,修改nginx.c:1143为:

ngx_conf_init_value(ccf->daemon, 0)
ngx_conf_init_value(ccf->master, 0);

重新编译后,即可使用GDB或者LLDB调试了:

在这里插入图片描述

目前虽然可以调试了,但是看代码,是没有intellisense的,也就不能正常代码跳转。所以最好是改为能够使用CMake构建系统,这样就可以使用clangd分析代码,进行代码跳转了。笔者根据源码中的脚本,写了一份可以在MinGW中使用的CMakeLists.txt,不过还是需要先在MinGW中执行auto/configure脚本。

CMakeLists.txt

cmake_minimum_required(VERSION 3.20)

project(nginx)

if(WIN32)
if(MSVC)
message(FATAL_ERROR "WIN32下不支持使用MSVC编译,仅支持MinGW或者Cygwin环境下使用gcc或者clang编译器编译")
endif()
endif()

if(NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/objs/ngx_auto_config.h)
message(STATUS "不存在ngx_auto_config.h,需要先执行`auto/configure`脚本")
endif()

if(NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/objs/ngx_auto_headers.h)
message(STATUS "ngx_auto_headers.h,需要先执行`auto/configure`脚本")
endif()

if(NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/objs/ngx_modules.c)
message(STATUS "不存在ngx_modules.c,需要先执行`auto/configure`脚本")
endif()

aux_source_directory(src/core SRC_LIST)
aux_source_directory(src/event SRC_LIST)
if(WIN32)
aux_source_directory(src/os/win32 SRC_LIST)
else()
aux_source_directory(src/os/unix SRC_LIST)
endif()
aux_source_directory(src/http SRC_LIST)
aux_source_directory(src/http/modules SRC_LIST)

list(REMOVE_ITEM SRC_LIST src/core/ngx_bpf.c)
list(APPEND SRC_LIST objs/ngx_modules.c)

if(WIN32)
list(APPEND SRC_LIST src/event/modules/ngx_win32_poll_module.c)
list(APPEND SRC_LIST src/event/modules/ngx_iocp_module.c)
list(APPEND SRC_LIST src/event/modules/ngx_win32_select_module.c)

list(REMOVE_ITEM SRC_LIST src/core/ngx_thread_pool.c)
list(REMOVE_ITEM SRC_LIST src/os/win32/ngx_service.c)
list(REMOVE_ITEM SRC_LIST src/event/ngx_event_connectex.c)
list(REMOVE_ITEM SRC_LIST src/http/modules/ngx_http_degradation_module.c)
list(REMOVE_ITEM SRC_LIST src/http/modules/ngx_http_dav_module.c)
list(REMOVE_ITEM SRC_LIST src/http/modules/ngx_http_realip_module.c)
list(REMOVE_ITEM SRC_LIST src/http/modules/ngx_http_geoip_module.c)
list(REMOVE_ITEM SRC_LIST src/http/modules/ngx_http_xslt_filter_module.c)
list(REMOVE_ITEM SRC_LIST src/http/modules/ngx_http_stub_status_module.c)
list(REMOVE_ITEM SRC_LIST src/http/modules/ngx_http_grpc_module.c)
endif()

add_executable(${PROJECT_NAME} ${SRC_LIST})

include_directories(src/core
	src/event
	src/event/modules
	src/http
	src/http/modules
	src/mail
	objs
)

if(WIN32)
include_directories(src/os/win32)
else()
include_directories(src/os/unix)
endif()

target_link_libraries(${PROJECT_NAME} PUBLIC advapi32 pcre crypto libz ws2_32 pcre2-8 ssl gd)

如果对你有帮助,欢迎点赞收藏!

相关文章:

  • SpringBoot实现接口重试方案
  • mac电脑如何将wps接入deepseek (傻瓜式教学)
  • 阿里云CEN创建实验
  • RTSP/Onvif安防视频EasyNVR平台 vs.多协议接入视频汇聚EasyCVR平台:设备分组的区别
  • Qt画动态环形或饼状图接口程序
  • langchain整合数据库
  • 深入理解 Java 线程池
  • CSS 盒模型
  • 宇数科技激光雷达L2
  • 设计模式-单一职责
  • 最新!Ubuntu Docker 安装教程
  • 11 Collection集合、Map集合:分类、功能、遍历、底层原理,Stream流:获取、中间方法、终结方法 (黑马Java视频笔记)
  • 电信大带宽服务器的应用场景都有哪些?
  • 21.多态
  • 【JDK17】开源应用服务器大比对
  • redis zset基本介绍以及底层实现
  • Unity音乐内存优化
  • jmeter吞吐量控制器-Throughput Controller
  • 计算机四级 - 数据库原理 - 第9章「数据库应用及安全性」
  • WebLogic XMLDecoder反序列化漏洞(CVE-2017-10271)深度解析与实战复现
  • 夜读丨在雨中撒欢儿
  • 南非总统承压赴美会晤特朗普,为开放星链或作种族政策妥协
  • 神舟二十号航天员乘组将于近日择机实施第一次出舱活动
  • 春决火爆的背后,PEL如何做大这块电竞蛋糕
  • 国家发改委:不断完善稳就业稳经济的政策工具箱,确保必要时能够及时出台实施
  • 4名中学生同服处方药后身体不适,一心堂一药店未凭处方售药被罚1万元