日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

记一次失败的Windows环境编译Nginx源码

發(fā)布時間:2024/4/11 windows 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 记一次失败的Windows环境编译Nginx源码 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

最近想學(xué)習(xí)下nginx的源碼,之前在linux環(huán)境編譯安裝過多次,在windows環(huán)境還是第一次嘗試,遇到了不少問題,記錄一下。可惜的是編譯成功后,在最后運行的時候還是會報錯,如果有人遇到類似的問題希望能幫忙解答下

環(huán)境安裝

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 和相關(guān)的組件了。
我需要安裝的有如下三個紅色框內(nèi)的組件msys-base,mingw32-base,mingw32-gcc-g++(安裝完全后組件的選擇框就會變?yōu)榫G色)

mingw32-base:必選,mingw的基礎(chǔ)包,核心的c編譯器
msys-base:MSYS 開發(fā)環(huán)境所需的包,在后續(xù)執(zhí)行configure時需要使用
mingw32-gcc-g++:C++的編譯器

選中后應(yīng)用更改,并安裝即可,如下圖

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目錄下,執(zhí)行如下命令:

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

會生成 libcrypto.a libssl.a libssl.dll.a libcrypto.dll.a 這四個文件和相應(yīng)的dll文件,如果不事先編譯openssl的話會在編譯Nginx的時候提示如下錯誤:(下載的openssl里沒有下述兩個文件,需要先編譯生成對應(yīng)文件)。將上述生成的四個文件復(fù)制到openssl的lib目錄下(沒有則自行創(chuàng)建)

下載nginx 并編譯

下載源碼必須通過http://hg.nginx.org/nginx 進行下載,不可使用發(fā)布的源碼包,否則無法支持windows下編譯。可以選擇在網(wǎng)頁下載或通過hg下載。

在nginx下創(chuàng)建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 文件。將下述內(nèi)容:

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"

保存文件后,需先執(zhí)行 make clean 清除編譯配置,然后重新創(chuàng)建objs/lib目錄并拷貝依賴文件,然后重新編譯

2.conflicting types for 'socklen_t’

頭文件函數(shù)聲明和函數(shù)定義參數(shù)不同, 一個是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.

這類錯誤基本都是屬于找不到所依賴的文件所導(dǎo)致的,所以應(yīng)該去:對應(yīng)目錄下確認所依賴的文件是否真實存在。

我原先使用的openssl-1.0.1u解壓縮后確實沒有對應(yīng)的ssl.h文件,替換成openssl-1.0.1e就可以了

4. libssl.a : No such file or directory

編譯下openssl,步驟在前面已經(jīng)說明過了

編譯成功后我使用Visual Studio Code打開對應(yīng)的nginx目錄,但是nginx.c文件會有如下編譯錯誤:

無法成功運行

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

參考資料:
https://blog.csdn.net/weixin_39970103/article/details/102616904
https://blog.csdn.net/wxh0000mm/article/details/100666329

總結(jié)

以上是生活随笔為你收集整理的记一次失败的Windows环境编译Nginx源码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。