我有两个关于NGINX的问题:
是否有人已经使用Visual Studio编译NGINX?我想创建一个VS9项目来编译NGINX。
这是我真正的需要,有没有办法将NGINX编译为Lib或DLL?
答案 0 :(得分:15)
我刚刚为nginx构建了一个Visual Studio 2010项目。这个过程并非完全直截了当,所以我将尝试详细介绍我所学到的一切。这是一个数小时到几天的过程,具体取决于您的经验。
第1步:您必须首先关注Guide for building nginx on windows。这不仅可以构建nginx,还可以创建在创建Visual Studio项目时使用的.c和.h文件。没有这些文件,它就无法工作。 (有关详细信息,请参阅here。)
如果您对我这样的Unix经验不足,上面的指南会留下一些悬而未决的问题。所以我首先用自己的提示充实本指南,然后再告诉你有关为Visual Studio创建项目的更多信息。
首先,按照上面给出的所有步骤进行操作。安装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文件夹(根级别)中。请注意,在此步骤之前,您可以将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文件。