最近想学习下nginx的源码,之前在linux环境编译安装过多次,在windows环境还是第一次尝试,遇到了不少问题,记录一下。可惜的是编译成功后,在最后运行的时候还是会报错,如果有人遇到类似的问题希望能帮忙解答下

环境安装

Nginx是使用C++编写的,所以我们首先需要的就是一个C++编译器,我选择通过MinGW安装gcc,然后进行编译,IDE选择的VS code。

1. gcc安装

首先安装MinGW,从https://sourceforge.net/projects/mingw/files/Installer/下载mingw-get-setup.exe 并安装,具体的安装过程可以参考博客MinGW安装教程,作者写的非常详尽了,我是之前自己安装过,就没有重新安装了

完成MinGW的安装后,就可以下载、安装、管理 MinGW 和相关的组件了。
我需要安装的有如下三个红色框内的组件msys-base,mingw32-base,mingw32-gcc-g++(安装完全后组件的选择框就会变为绿色)

mingw32-base:必选,mingw的基础包,核心的c编译器
msys-base:MSYS 开发环境所需的包,在后续执行configure时需要使用
mingw32-gcc-g++:C++的编译器

选中后应用更改,并安装即可,如下图

2. perl,pcre,zlib,openssl 下载安装

安装 perl, Perl From ActiveState 下载,然后按照正常步骤安装即可(我选择的是5.26版本)
pcre: 下载地址 https://ftp.pcre.org/pub/pcre/ ,我选择的版本是pcre-8.36
zlib: 下载地址 http://zlib.net/zlib-1.2.11.tar.gz
openssl: 下载地址: https://www.openssl.org/source/old/1.0.1/,我选择的版本是openssl-1.0.1e
openssl,zlib,pcre下载的都是以tar.gz为后缀的压缩包

编译openssl

加压缩后,使用msys进入到openssl目录下,执行如下命令:

./config -t./config threads shared no-capiengmake dependmake

会生成 libcrypto.a libssl.a libssl.dll.a libcrypto.dll.a 这四个文件和相应的dll文件,如果不事先编译openssl的话会在编译Nginx的时候提示如下错误:(下载的openssl里没有下述两个文件,需要先编译生成对应文件)。将上述生成的四个文件复制到openssl的lib目录下(没有则自行创建)

下载nginx 并编译

下载源码必须通过http://hg.nginx.org/nginx 进行下载,不可使用发布的源码包,否则无法支持windows下编译。可以选择在网页下载或通过hg下载。

在nginx下创建objs/lib目录,并将解压(编译)后的openssl,zlib,pcre文件夹拷贝到lib目录下,使用如下命令进行编译

./auto/configure --with-cc=gcc --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.36 \
--with-zlib=objs/lib/zlib-1.2.11 --with-openssl=objs/lib/openssl-1.0.1e \
--with-select_module  --with-http_ssl_module

使用gcc作为编译器,而不是vs的cl,因为我没有安装,使用cl的话在编译的报错日志里会有找不到command的错误信息

编译成功如下:

编译过程中遇到的问题:

1. make[1]: *** [objs/lib/openssl-1.0.1u/.openssl/include/openssl/ssl.h] Error 1
解决办法:
进入nginx根目录下的auto/lib/openssl 目录,
编辑 conf 文件。将下述内容:

CORE_INCS="$CORE_INCS $OPENSSL/.openssl/include"
CORE_DEPS="$CORE_DEPS $OPENSSL/.openssl/include/openssl/ssl.h"
CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libssl.a"
CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libcrypto.a"

修改为:

CORE_INCS="$CORE_INCS $OPENSSL/include"
CORE_DEPS="$CORE_DEPS $OPENSSL/include/openssl/ssl.h"
CORE_LIBS="$CORE_LIBS $OPENSSL/lib/libssl.a"
CORE_LIBS="$CORE_LIBS $OPENSSL/lib/libcrypto.a"

保存文件后,需先执行 make clean 清除编译配置,然后重新创建objs/lib目录并拷贝依赖文件,然后重新编译

2.conflicting types for 'socklen_t’

头文件函数声明和函数定义参数不同, 一个是unsigned int,一个是int,
我将mingw里的ws2tcpip.h里的unsigned int socklen_t改成了int socklen ,就没有再报上述错误了

3.make[1]: *** No rule to make target objs/lib/openssl-1.0.1u/include/openssl/ssl.h', needed byobjs/src/core/nginx.o’. Stop.

这类错误基本都是属于找不到所依赖的文件所导致的,所以应该去:对应目录下确认所依赖的文件是否真实存在。

我原先使用的openssl-1.0.1u解压缩后确实没有对应的ssl.h文件,替换成openssl-1.0.1e就可以了

4. libssl.a : No such file or directory

编译下openssl,步骤在前面已经说明过了

编译成功后我使用Visual Studio Code打开对应的nginx目录,但是nginx.c文件会有如下编译错误:

无法成功运行

。。。。。。。。。。。。。

参考资料:
https://blog.csdn.net/weixin_39970103/article/details/102616904
https://blog.csdn.net/wxh0000mm/article/details/100666329

记一次失败的Windows环境编译Nginx源码相关推荐

  1. WINDOWS 下编译 ffmpeg 源码总结

    WINDOWS 下编译 ffmpeg 源码,有两种方式:VC.GCC 1.VC 编译:   https://github.com/ShiftMediaProject/FFVS-Project-Gene ...

  2. Windows IEDA 编译Hbase源码报错 - 无法执行shell脚本

    windows 下编译 hbase源码,报错 [ERROR] Command execution failed. java.io.IOException: Cannot run program &qu ...

  3. Windows 环境下载 Android 源码

    Windows 环境下载 Android 源码 前言 Android 官网(该方式不适合 Windows 平台):https://source.android.com/source/downloadi ...

  4. CMake编译Nginx源码

    背景 最近打算学习nginx源码,但使用clion IDE查看不支持跳转.因为源码是使用autotool维护的,而clion需要CMake管理项目.着手编译nginx源码. 环境 os : ubunt ...

  5. windows下载编译chromium源码

    前言 chromium 源码的下载编译,真的就是如各位前辈说的一样,参考再完整的教程,还是会遇到各种各样的问题.因为每个人的开发环境是不一样的,网络环境也不一样. 一路参考各路大神的教程开始踩坑填坑的 ...

  6. 龙芯3a5000下编译nginx源码

    1.nginx源码获取 http://hg.nginx.org/nginx 选择tag,选择稳定版本1.22,点击gz下载gz压缩格式的源码. 2.编译环境需要安装一大堆依赖,不过我测试这台机器因为之 ...

  7. windows下编译pcl-master源码(带GPU)

    参考博客 1.http://pointclouds.org/documentation/tutorials/compiling_pcl_windows.php#compiling-pcl-window ...

  8. windows下编译lua源码

    http://blog.csdn.net/zjg555543/article/details/11814563 因为之前一直使用 lua for windows 来搭建lua的使用环境,但是最新的 l ...

  9. 在Windows上编译Spark源码

    原文转自http://my.oschina.net/u/1452001/blog/344067?fromerr=1iS9kYnS 在本机(Windows 8)上安装spark玩一玩,Spark的Qui ...

最新文章

  1. RabbitMQ学习系列(五): RPC 远程过程调用
  2. Linux内核中ioremap映射的透彻理解
  3. Fedora9安装中文输入法
  4. Error(s) in loading state_dict for ResNet 问题解决
  5. 前端学习(1710):前端系列javascript之uniapp介绍
  6. 做DNS子域委派配置
  7. Linux学习总结(22)——CentOS7.2安装Nginx
  8. 计算机软件版本号是什么意思,带你深入了解解密Windows系统版本和版本号
  9. 【Axure图标库】单线形图标元件库 细线矢量图标1000+
  10. 高一计算机组装与维护教学总结,计算机优秀个人教学总结
  11. matlab设计译码器,基于Matlab编译码器的仿真与设计
  12. LeetCode 285. 二叉搜索树中的中序后继
  13. 联想z400linux调节屏幕亮度,联想Z400电脑显示屏亮度无法调节怎么办
  14. 董卿频上热搜的背后:阅读量之广令人惊叹,靠的不仅仅是坚持
  15. CSS3渐变属性:线性渐变和径向渐变用法教程
  16. android微信小程序自动填表_微信“填表”类小程序,你可能根本没用对
  17. pytorch中张量的阶数理解
  18. 制作圆形图片,你会以下几种?
  19. [Openwrt 项目开发笔记]:Openwrt平台搭建(一)
  20. HTML复选框里添加下拉框,Html:实现带复选框的下拉框(一)

热门文章

  1. 建造者模式源码解析(jdk-guava+mybatis)
  2. ORACLE 表类型 OLTP和OLAP
  3. 使用Docker运行java项目需要注意的glibc依赖库问题
  4. Protobuf之proto文件编写规则
  5. Java开源诊断工具 Arthas 发布v3.1.0
  6. [置顶] mkdir函数-linux
  7. Centos7KVM的安装与配置及创建虚拟机
  8. 在Visual Studio的Server Explorer中怎样修改表名
  9. Python 进程与线程小随笔
  10. Laravel Model 利用 Macroable 为数据模型添加宏能力