使用Visual Studio编译NGINX

6

我有两个关于NGINX的问题:

  1. 是否有人已经使用Visual Studio编译过NGINX?我想创建一个VS9项目来编译NGINX。

  2. 这是我真正的需求,有没有办法将NGINX编译成Lib或DLL文件?


1
http://nginx.org/en/docs/howto_build_on_win32.html - SLaks
谢谢SLaks,希望有一个脚本可以创建VS项目而不仅仅编译Nginx。 - dectroo
1个回答

19

我刚刚完成了一个用于nginx的Visual Studio 2010项目的构建。这个过程并不是完全直接,所以我会尽力详细介绍我所学到的所有内容。这是一个几小时到几天的过程,具体取决于你的经验。

步骤1:你必须首先按照在Windows上构建nginx指南。这不仅会构建nginx,还会创建您在创建Visual Studio项目时使用的 .c 和 .h 文件。没有这些文件它是运行不起来的。(更多信息,请参见此处。)

如果像我一样对Unix不是很熟悉,上述指南会有一些未解答的问题。因此,我首先会补充该指南的一些技巧,然后再告诉您有关为Visual Studio创建项目的更多信息。

第一部分:使用MSYS编译适用于Windows的nginx

首先,按照以上所有步骤进行操作。安装MSYS、Strawberry Perl、Mercurial,并下载PCRE、zlib和OpenSSL库。然后按照以下步骤进行操作:

1)以管理员身份打开命令提示符。然后运行您的Visual Studio vc \ vcvarsall.bat文件,以设置环境变量并将VC用作编译器。您的路径可能不同,但我使用的命令是:

"C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"

我发现即使Strawberry Perl添加了3个路径(您可以通过检查PATH变量进行验证),它仍然在使用错误的Perl。
2)运行msys.bat启动MSys。对于我来说,MSys安装在MinGW目录中,所以我的路径是: C:\ MinGW \ msys \ 1.0 \ msys.bat
如果成功,您应该在绿色中看到类似于以下内容: JensenV@AVWMA047LB ~ (除了您的用户名@networkaddress之外),在名为MINGW32:〜的窗口中
您可能想知道您的“主文件夹”在哪里。它在msys \ 1.0 \ home下。因此,在我的系统上,它在这里: C:\ MinGW \ msys \ 1.0 \ home \ JensenV
如果您执行“ls”或“dir”,则最初将进入此目录。
3)假设按照上述说明安装了Mercurial,则现在应该能够检出ngynx源: hg clone http://hg.nginx.org/nginx 这将进入上面提到的目录。

4) 您需要确保使用的perl版本是strawberry perl,而不是msys附带的版本。输入:which perl

如果您得到类似于“/bin/perl.exe”的内容,则是错误的perl版本,您需要修复路径。您可以尝试更改此设置(如我所做,但没有成功),或者您可以禁用msys附带的perl版本。我只是将perl.exe重命名为perl_UNUSED.exe在我的msys安装中:

C:\MinGW\msys\1.0\bin

无论你做什么,请确保“which perl”显示Strawberry Perl的路径,然后再继续。

5) 我还将msys\1.0\bin目录中的"link.exe"重命名为"link_UNUSED.exe",这样就不会使用它了。(即将其重命名为“link_UNUSED.exe”)

我认为这是因为,在上面的第1步中,“vcvarsall.bat”将所有内容都设置为使用Microsoft C的编译器/链接器,但是在第2步中,链接器被更改为使用Msys的链接器。你需要使用Microsoft的链接器。

要验证将其重命名为“link_UNUSED.exe”是否成功,请键入: which link 并确保它指向Visual Studio 10的链接器,而不是与msys一起提供的link.exe。

6) 首先“cd nginx”,然后在nginx文件夹内创建一个objs/lib文件夹树。按照guide中提到的方法在此处解压pcre、zlib和openssl。

7) 当前目录仍为nginx时,运行nginx的自动配置脚本,但首先修改以下命令以更改sopenssl、pcre和zlib的路径,使其正确安装在objs/lib中(您的版本号可能不同)。我使用的命令是:

auto/configure --with-cc=cl --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.33 \
--with-zlib=objs/lib/zlib-1.2.8 \
--with-openssl=objs/lib/openssl-1.0.1f \
--with-select_module --with-http_ssl_module --with-ipv6

如果您想要更改任何配置选项,现在就是时候了。这些选项会影响生成的 .c 和 .h 文件,您稍后将在创建 Visual Studio 项目时使用它们,相信我,当您意识到需要不同的选项时,您不希望以后重新做这些工作。
7) 进行编译。
nmake -f objs/Makefile 如果成功,您新编译的 nginx.exe 应该在 home\YourUsername\nginx\objs 文件夹中。例如: C:\MinGW\msys\1.0\home\JensenV\nginx\objs
此外,这些文件现在将与 nginx.exe 在同一个文件夹中: ngx_auto_config.h ngx_auto_headers.h ngx_modules.c ngx_pch.c
您将在创建 Visual Studio 项目时使用它们。
8) 喝杯啤酒。

**

第二部分:创建Visual Studio nginx项目

**

创建一个空的Visual Studio命令行应用程序项目。将项目保存在您的nginx文件夹(根级别)中。请注意,在此步骤之前,您可以将nginx文件夹移动到您想要保存它的任何位置。

1)转到属性 -> VC ++目录并添加这些包含目录:

$(MSBuildProjectDirectory)\src\core $(MSBuildProjectDirectory)\src\event $(MSBuildProjectDirectory)\src\event\modules $(MSBuildProjectDirectory)\src\http $(MSBuildProjectDirectory)\src\http\modules $(MSBuildProjectDirectory)\src\http\modules\perl $(MSBuildProjectDirectory)\src\mail $(MSBuildProjectDirectory)\src\misc $(MSBuildProjectDirectory)\src\mysql $(MSBuildProjectDirectory)\src\os $(MSBuildProjectDirectory)\objs $(MSBuildProjectDirectory)\src\os\win32 $(MSBuildProjectDirectory)\objs\lib\openssl\ssl\include $(MSBuildProjectDirectory)\objs\lib\zlib $(MSBuildProjectDirectory)\objs\lib\pcre

注意:在此步骤之前,我进入了objs/lib并从zlib、pcre和ssl文件夹中删除了版本号。您也应该这样做,或者您应该修改上面的路径以匹配您安装的版本。我删除了版本号,这样我就可以在将来更新这些库的新版本而不破坏我的项目。

点击“宏>>”按钮,并验证MSBuildProjectDirectory路径是否为您的nginx文件夹的路径。

2)同样将这些路径添加到库目录中:

$(MSBuildProjectDirectory)\objs\lib\openssl\ssl\lib\ $(MSBuildProjectDirectory)\objs\lib\pcre\ $(MSBuildProjectDirectory)\objs\lib\zlib\

如果objs/lib文件夹的内容仍然有版本号,则再次修改这些路径以包括版本号。

3)按以下方式更改这些项目属性:

C/C++ General: 将“将警告视为错误”设置为否(WX-) Preprocessor: 添加这些预处理器定义: WIN32 NGX_WIN32 NGX_MAIL_SSL NO_SYS_TYPES_H FD_SETSIZE=1024

链接器: 输入:将以下内容添加到附加依赖项中: ws2_32.lib pcre.lib ssleay32.lib libeay32.lib crypt32.lib zlib.lib

4)关闭Visual Studio解决方案。用好的文本编辑器(如Notepad ++)打开项目文件(以.vcxproj结尾)。 (首先备份一份,以防出现问题。)还要用文本编辑器打开nginx\objs\makefile。

在makefile中不太远离顶部,您将看到一个类似于以下内容的部分:

objs/nginx.exe: objs/src/core/nginx.obj \ objs/src/core/ngx_log.obj \ objs/src/core/ngx_palloc.obj \ objs/src/core/ngx_array.obj \ .... objs/ngx_modules.obj \ objs/nginx.res \ objs/lib/pcre-8.33/pcre.lib \ objs/lib/zlib-1.2.8/zlib.lib $(LINK) @<<

同样,在Visual Studio文件中,如果您已添加任何源代码(在此步骤之前添加任何文件,以便您可以看到我在谈论什么),您将看到类似于以下内容的部分:


创建一个新文档,仅包含 makefile 中的 .obj 文件。使用文本编辑器中的搜索和替换功能,将它们修改为与 Visual Studio 项目文件格式相匹配的格式(以.c /> 结尾而不是.obj \ 结尾,并且以 <ClCompile Include= 开头)。
此外,请勿忘记将正斜杠改为反斜杠。不要包括 zlib.lib 或 pcre.lib 行。我忘了是否应该包括 nginx.res。(可能不需要。)
确保格式正确后,保存 Visual Studio 项目并尝试打开它。如果 makefile 中的所有文件都显示在您的项目中,则说明操作正确。
5)还记得 nginx 在构建 exe 时创建的那些特殊的 .c 和 .h 文件吗?现在你也要将它们添加到你的项目中。添加这两个文件:
ngx_modules.c ngx_pch.c
6)现在你已经准备好编译了!
老实说,我可能漏掉了一些东西,所以你可能仍然需要修复一些链接器或编译器错误,但这应该会给你一个良好的开始!
注:如果您想更改在 nginx 中包含的 options,则必须在上面的第一部分中进行新的自动配置、进行新的 nmake,然后在您的 Visual Studio 项目中包括其他源代码,并在您的 Visual Studio 项目中使用新生成的 ngx_modules.c 和 ngx_pch.c 文件。

2
令人惊讶。只用了3小时就把它搞定了,而我花了2天时间在没有在 Stack Overflow 上搜索的情况下弄清所有这些东西。 - Tommi
谢谢 Vern Jensen,我放弃了这个项目一段时间 :) - dectroo
是的,我真的很喜欢Mongoose。它比nginx简单得多,而且对于我们的需求来说非常完美。它甚至支持WebSockets,在我们下一个项目中可能会用到。 - Vern Jensen
我的msys/1.0/bin文件夹恰好没有link.exe,当我输入“which link”时它无法识别。 - Toan Lu
我遇到了一个错误 checking for C compiler ... not found auto/configure: error: C compiler cl is not found 不确定为什么?有人知道吗? - Rahil Wazir
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接