【问题标题】:Compile NGINX with Visual Studio使用 Visual Studio 编译 NGINX
【发布时间】:2014-01-31 17:36:13
【问题描述】:

我有两个关于 NGINX 的问题:

  1. 有没有人已经用 Visual Studio 编译过 NGINX?我想创建一个用于编译 NGINX 的 VS9 项目。

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

【问题讨论】:

标签: visual-studio nginx


【解决方案1】:

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

第 1 步:您必须首先关注Guide for building nginx on windows。这不仅会构建 nginx,还会创建 .c 和 .h 文件,您将在创建 Visual Studio 项目时使用这些文件。没有这些文件就行不通。 (欲了解更多信息,请参阅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 ~ (除了你的用户名@网络地址)在一个名为 MINGW32 之类的窗口中:~

您可能想知道您的“主文件夹”在哪里。它在 msys\1.0\home 下。所以在我的系统上,它在这里: C:\MinGW\msys\1.0\home\JensenV

如果您执行“ls”或“dir”,这是您最初所在的目录。

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

这将进入上述目录。

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

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

C:\MinGW\msys\1.0\bin

无论你做什么,在继续之前确保“which perl”显示了 Strawberry Perl 的路径。

5) 在我的 msys\1.0\bin 目录中也重命名了“link.exe”: C:\MinGW\msys\1.0\bin 所以它没有被使用。 (即重命名为“link_UNUSED.exe”)

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

要验证重命名为“link_UNUSED.exe”是否成功,请键入: 哪个链接 并确保它指向您的 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

如果你想change any configuration options,现在是时候了。这些选项会影响生成的 .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 文件夹移到 msys 之外的任何位置。

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++ 常规:将“将警告视为错误”设置为否 (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 \ 对象/nginx.res \ objs/lib/pcre-8.33/pcre.lib \ objs/lib/zlib-1.2.8/zlib.lib $(链接)@

同样,在 Visual Studio 文件中,如果您添加了任何源代码(在此步骤之前添加您想要的任何文件,以便您可以看到我在说什么),您将看到如下内容:

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

也不要忘记将正斜杠改为反斜杠。不要包含 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 文件。

【讨论】:

  • 令人惊讶。只花了 3 个小时就让它工作了,而我花了 2 天时间才弄清楚所有这些东西,而没有在 SO 上搜索。
  • 感谢 Vern Jensen,我暂时放弃了这个项目 :)
  • 非常感谢你写这篇文章。我昨天完成了第 1 部分的所有内容,尽管捆绑的 Perl 似乎已经奏效了。我将用草莓 perl 重新编译。
  • 很高兴听到!谢谢你让我知道。 :-)
  • (具有讽刺意味的是,在我为启动和运行 nginx 所做的一切之后,我们的团队决定改用 Mongoose(C Web 服务器)。哈哈。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-13
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-20
  • 2014-08-04
相关资源
最近更新 更多