使用Visual Studio编译NGINX

时间:2014-01-31 17:36:14

标签: visual-studio nginx

我有两个关于NGINX的问题:

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

  2. 这是我真正的需要,有没有办法将NGINX编译为Lib或DLL?

1 个答案:

答案 0 :(得分:15)

我刚刚为nginx构建了一个Visual Studio 2010项目。这个过程并非完全直截了当,所以我将尝试详细介绍我所学到的一切。这是一个数小时到几天的过程,具体取决于您的经验。

第1步:您必须首先关注Guide for building nginx on windows。这不仅可以构建nginx,还可以创建在创建Visual Studio项目时使用的.c和.h文件。没有这些文件,它就无法工作。 (有关详细信息,请参阅here。)

如果您对我这样的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 \家\ JensenV

如果你做" ls"或者" dir"这是您最初的目录。

3)假设您按照上面的说明安装了Mercurial,您现在应该可以查看ngynx源代码: hg clone http://hg.nginx.org/nginx

这将进入上述目录。

4)你需要确保使用的perl版本是草莓perl,而不是msys附带的版本。类型: 哪个perl

如果你得到类似" /bin/perl.exe"这是错误的perl,你需要修复你的路径。你可以弄乱这个(就像我做的那样,失败了)或者你可以禁用msys附带的perl版本。我刚改名 我的msys安装中的perl.exe到perl_UNUSED.exe:

C:\ MinGW的\ MSYS \ 1.0 \ BIN

无论你做什么,请确保" perl"在继续之前显示了草莓Perl的路径。

5)同时重命名" link.exe"在我的msys \ 1.0 \ bin目录中: C:\ MinGW的\ MSYS \ 1.0 \ BIN 这样它就不用了。 (即将其重命名为" link_UNUSED.exe")

我相信这是因为,在上面的第1步中,你的" vcvarsall.bat"将所有内容设置为使用Microsoft C&C的编译器/链接器,但在步骤2中,链接器已更改为使用Msys代替。您需要使用Microsoft。

验证重命名为" link_UNUSED.exe"成功了,输入: 哪个链接 并确保它指向您的Visual Studio 10链接,而不是msys附带的link.exe。

6)首先" cd nginx"然后在nginx文件夹中创建一个objs / lib文件夹树。如guide中所述,在此处解压/解压缩pcre,zlib和openssl。

7)当你的当前目录仍然是nginx时,运行nginx的autoconfigure脚本,但首先修改下面的命令来改变路径 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

如果你想要change any configuration options,现在就是时候了。这些选项会影响您稍后在创建Visual Studio项目时使用的生成的.c和.h文件,并且相信我,您不希望以后在您意识到需要不同选项时重做。

7)成功。

nmake -f objs / Makefile

如果成功,您新编译的nginx.exe应该在您的home \ YourUsername \ nginx \ objs文件夹中。即: C:\ MinGW的\ MSYS \ 1.0 \家\ JensenV \ nginx的\ OBJ文件

此外,这些文件现在与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文件夹(根级别)中。请注意,在此步骤之前,您可以将msys文件夹移到msys之外的任何位置。

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

$(MSBuildProjectDirectory)\ SRC \芯 $(MSBuildProjectDirectory)的\ src \事件 $(MSBuildProjectDirectory)的\ src \事件\模块 $(MSBuildProjectDirectory)的\ src \ HTTP $(MSBuildProjectDirectory)的\ src \ HTTP \模块 $(MSBuildProjectDirectory)的\ src \ HTTP \模块\ perl的 $(MSBuildProjectDirectory)的\ src \邮件 $(MSBuildProjectDirectory)的\ src \杂项 $(MSBuildProjectDirectory)的\ src \ mysql的 $(MSBuildProjectDirectory)的\ src \ OS $(MSBuildProjectDirectory)\ OBJ文件 $(MSBuildProjectDirectory)的\ src \ OS \ WIN32 $(MSBuildProjectDirectory)\ OBJ文件\ LIB \ OpenSSL的\ SSL \包括 $(MSBuildProjectDirectory)\ OBJ文件\ LIB \ zlib的 $(MSBuildProjectDirectory)\ OBJ文件\ lib中\ PCRE

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

点击"宏>>"按钮并验证MSBuildProjectDirectory路径是否是nginx文件夹的路径。

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

$(MSBuildProjectDirectory)\ OBJ文件\ lib中\ OpenSSL的\ SSL \ lib中\ $(MSBuildProjectDirectory)\ OBJ文件\ LIB \ PCRE \ $(MSBuildProjectDirectory)\ OBJ文件\ lib中\ ZLIB \

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

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

C / C ++   一般:设置"将警告视为错误"否(WX-)   预处理器:添加这些预处理器定义:     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 \     的OBJ / LIB / zlib的-1.2.8 / zlib.lib     $(LINK)@<<

同样,在Visual Studio文件中,如果您添加了任何源代码(在此步骤之前添加了您想要的任何文件,那么您可以看到我正在谈论的内容)您将会这样做看到这样的事情:

              

创建一个新文档,其中只包含makefile中的.obj文件。使用搜索&在文本编辑器中替换以修改它们以匹配Visual Studio项目文件的格式(因此以.c />而不是.obj \结尾,并以

也不要忘记将正斜杠更改为反斜杠。不要包含zlib.lib或pcre.lib行。我忘了你是否应该包括nginx.res。 (可能不是。)

一旦确定格式正确,请保存Visual Studio项目并尝试打开它。如果makefile中的所有文件都显示在项目中,则表明您已正确完成。

5)还记得构建exe时nginx创建的那些特殊的.c和.h文件吗?您现在也想将它们添加到项目中。加上这些人:

ngx_modules.c ngx_pch.c

6)现在你已准备好编译了!

老实说我可能遗忘了一些东西,所以你可能仍然会有一些链接器或编译错误来修复,但这应该会给你一个良好的开端!

注意:如果您想更改nginx中包含的options,您必须在上面的第I部分中执行新的自动/配置,新的nmake,然后在其中包含其他源代码您是Visual Studio项目,并在Visual Studio项目中使用新生成的ngx_modules.c和ngx_pch.c文件。