记一次失败的Windows环境编译Nginx源码
最近想學(xué)習(xí)下nginx的源碼,之前在linux環(huán)境編譯安裝過多次,在windows環(huán)境還是第一次嘗試,遇到了不少問題,記錄一下。可惜的是編譯成功后,在最后運(yùn)行的時(shí)候還是會(huì)報(bào)錯(cuò),如果有人遇到類似的問題希望能幫忙解答下
環(huán)境安裝
Nginx是使用C++編寫的,所以我們首先需要的就是一個(gè)C++編譯器,我選擇通過MinGW安裝gcc,然后進(jìn)行編譯,IDE選擇的VS code。
1. gcc安裝
首先安裝MinGW,從https://sourceforge.net/projects/mingw/files/Installer/下載mingw-get-setup.exe 并安裝,具體的安裝過程可以參考博客MinGW安裝教程,作者寫的非常詳盡了,我是之前自己安裝過,就沒有重新安裝了
完成MinGW的安裝后,就可以下載、安裝、管理 MinGW 和相關(guān)的組件了。
我需要安裝的有如下三個(gè)紅色框內(nèi)的組件msys-base,mingw32-base,mingw32-gcc-g++(安裝完全后組件的選擇框就會(huì)變?yōu)榫G色)
mingw32-base:必選,mingw的基礎(chǔ)包,核心的c編譯器
msys-base:MSYS 開發(fā)環(huán)境所需的包,在后續(xù)執(zhí)行configure時(shí)需要使用
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進(jìn)入到openssl目錄下,執(zhí)行如下命令:
./config -t./config threads shared no-capiengmake dependmake會(huì)生成 libcrypto.a libssl.a libssl.dll.a libcrypto.dll.a 這四個(gè)文件和相應(yīng)的dll文件,如果不事先編譯openssl的話會(huì)在編譯Nginx的時(shí)候提示如下錯(cuò)誤:(下載的openssl里沒有下述兩個(gè)文件,需要先編譯生成對應(yīng)文件)。將上述生成的四個(gè)文件復(fù)制到openssl的lib目錄下(沒有則自行創(chuàng)建)
下載nginx 并編譯
下載源碼必須通過http://hg.nginx.org/nginx 進(jìn)行下載,不可使用發(fā)布的源碼包,否則無法支持windows下編譯。可以選擇在網(wǎng)頁下載或通過hg下載。
在nginx下創(chuàng)建objs/lib目錄,并將解壓(編譯)后的openssl,zlib,pcre文件夾拷貝到lib目錄下,使用如下命令進(jìn)行編譯
./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,因?yàn)槲覜]有安裝,使用cl的話在編譯的報(bào)錯(cuò)日志里會(huì)有找不到command的錯(cuò)誤信息
編譯成功如下:
編譯過程中遇到的問題:
1. make[1]: *** [objs/lib/openssl-1.0.1u/.openssl/include/openssl/ssl.h] Error 1
解決辦法:
進(jìn)入nginx根目錄下的auto/lib/openssl 目錄,
編輯 conf 文件。將下述內(nèi)容:
修改為:
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ù)不同, 一個(gè)是unsigned int,一個(gè)是int,
我將mingw里的ws2tcpip.h里的unsigned int socklen_t改成了int socklen ,就沒有再報(bào)上述錯(cuò)誤了
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.
這類錯(cuò)誤基本都是屬于找不到所依賴的文件所導(dǎo)致的,所以應(yīng)該去:對應(yīng)目錄下確認(rèn)所依賴的文件是否真實(shí)存在。
我原先使用的openssl-1.0.1u解壓縮后確實(shí)沒有對應(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文件會(huì)有如下編譯錯(cuò)誤:
無法成功運(yùn)行
。。。。。。。。。。。。。
參考資料:
https://blog.csdn.net/weixin_39970103/article/details/102616904
https://blog.csdn.net/wxh0000mm/article/details/100666329
總結(jié)
以上是生活随笔為你收集整理的记一次失败的Windows环境编译Nginx源码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++中的指针与引用
- 下一篇: tomcat 启动异常 The web