为什么我在为Windows编译NGINX时出错



我正试图用RTMP模块为Windows编译NGINX,但我一直遇到错误。我一直遵循的指南是http://nginx.org/en/docs/howto_build_on_win32.html

我安装了以下软件:

  • MSYS2
  • Strawberry Perl(64位(
  • Visual Studio 2022(社区版(+使用C++工作负载的桌面开发

安装MSYS2后,我遵循了中的安装后说明

pacman -Syu
pacman -Su
pacman -S --needed base-devel mingw-w64-x86_64-toolchain

我已经为PATH 设置了以下系统环境变量

C:Strawberrycbin
C:Strawberryperlsitebin
C:Strawberryperlbin
C:msys64mingw64bin

我已经将NGINX源代码下载到"C:"驱动器上一个名为"NGINX"的目录中。在这个目录中,我下载并提取了以下包到目录"objs/lib"中。

  • zlib-1.2.11
  • 百分比2-10.39
  • 开口-1.1m
  • nginx-rmp-模块-1.2.2

这将创建以下目录结构

nginx
objs
lib
zlib-1.2.11
pcre2-10.39
openssl-1.1.1m 
nginx-rtmp-module-1.2.2

我已经通过从Visual C目录运行"vcvarsall.bat"脚本设置了Visual C环境

PS C:Program FilesMicrosoft Visual Studio2022CommunityVCAuxiliaryBuild> .vcvarsall.bat amd64
**********************************************************************
** Visual Studio 2022 Developer Command Prompt v17.0.5
** Copyright (c) 2021 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64'

在其他一些指南中,他们指示修改"auto\lib\openssl"中的"makefile.msvc"文件原始文件

# Copyright (C) Igor Sysoev
# Copyright (C) Nginx, Inc.

all:
cd $(OPENSSL)
perl Configure VC-WIN32 no-shared               
--prefix="%cd%/openssl"                 
--openssldir="%cd%/openssl/ssl"             
$(OPENSSL_OPT)
if exist msdo_ms.bat (                     
msdo_ms                        
&& $(MAKE) -f msnt.mak                 
&& $(MAKE) -f msnt.mak install             
) else (                            
$(MAKE)                         
&& $(MAKE) install_sw                   
)

修改的文件

# Copyright (C) Igor Sysoev
# Copyright (C) Nginx, Inc.

all:
cd $(OPENSSL)
perl Configure VC-WIN64A no-shared              
--prefix="%cd%/openssl"                 
--openssldir="%cd%/openssl/ssl"             
$(OPENSSL_OPT)
if exist msdo_win64a.bat (                     
msdo_ms                        
&& $(MAKE) -f msnt.mak                 
&& $(MAKE) -f msnt.mak install             
) else (                            
$(MAKE)                         
&& $(MAKE) install_sw                   
)

使用MSYS2 MinGW x64我已经运行了配置脚本

auto/configure 
--with-cc=cl 
--with-debug 
--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 
--http-scgi-temp-path=temp/scgi_temp 
--http-uwsgi-temp-path=temp/uwsgi_temp 
--with-cc-opt=-DFD_SETSIZE=1024 
--with-pcre=objs/lib/pcre2-10.39 
--with-zlib=objs/lib/zlib-1.2.11 
--with-openssl=objs/lib/openssl-1.1.1m 
--with-openssl-opt=no-asm 
--with-http_ssl_module 
--add-module=objs/lib/nginx-rtmp-module-1.2.2 
--with-http_flv_module 
--with-http_gzip_static_module 
--with-http_mp4_module 
--with-http_v2_module 
--with-stream 
--with-stream_ssl_module 
--with-http_dav_module 
--with-http_realip_module 
--with-http_auth_request_module 
--with-http_stub_status_module
checking for OS
+ MINGW64_NT-10.0-19044 3.3.3-341.x86_64 x86_64
+ using Microsoft Visual C++ compiler
+ cl version: 19.30
checking for MINGW64_NT-10.0-19044 specific features
configuring additional modules
adding module in objs/lib/nginx-rtmp-module-1.2.2
+ ngx_rtmp_module was configured
creating objs/Makefile
Configuration summary
+ using PCRE2 library: objs/lib/pcre2-10.39
+ using OpenSSL library: objs/lib/openssl-1.1.1m
+ using zlib library: objs/lib/zlib-1.2.11
nginx path prefix: ""
nginx binary file: "/nginx.exe"
nginx modules path: "/modules"
nginx configuration prefix: "/conf"
nginx configuration file: "/conf/nginx.conf"
nginx pid file: "/logs/nginx.pid"
nginx error log file: "/logs/error.log"
nginx http access log file: "/logs/access.log"
nginx http client request body temporary files: "temp/client_body_temp"
nginx http proxy temporary files: "temp/proxy_temp"
nginx http fastcgi temporary files: "temp/fastcgi_temp"
nginx http uwsgi temporary files: "temp/uwsgi_temp"
nginx http scgi temporary files: "temp/scgi_temp"

最后,为了构建NGINX,我在"x64 Native Tools命令提示符for VS 2022"中运行了"nmake"命令,这给了我错误

C:nginx>nmake
Microsoft (R) Program Maintenance Utility Version 14.30.30709.0
Copyright (C) Microsoft Corporation.  All rights reserved.
"C:Program FilesMicrosoft Visual Studio2022CommunityVCToolsMSVC14.30.30705binHostX64x64nmake.exe" -f objs/Makefile
Microsoft (R) Program Maintenance Utility Version 14.30.30709.0
Copyright (C) Microsoft Corporation.  All rights reserved.
"C:Program FilesMicrosoft Visual Studio2022CommunityVCToolsMSVC14.30.30705binHostX64x64nmake.exe" -f auto/lib/openssl/makefile.msvc                                 OPENSSL="objs/lib/openssl-1.1.1m" OPENSSL_OPT="no-asm"
Microsoft (R) Program Maintenance Utility Version 14.30.30709.0
Copyright (C) Microsoft Corporation.  All rights reserved.
cd objs/lib/openssl-1.1.1m
perl Configure VC-WIN64A no-shared                               --prefix="%cd%/openssl"                                 --openssldir="%cd%/openssl/ssl"                         no-asm
Configuring OpenSSL version 1.1.1m (0x101010dfL) for VC-WIN64A
Using os-specific seed configuration
Creating configdata.pm
Creating makefile
**********************************************************************
***                                                                ***
***   OpenSSL has been successfully configured                     ***
***                                                                ***
***   If you encounter a problem while building, please open an    ***
***   issue on GitHub <https://github.com/openssl/openssl/issues>  ***
***   and include the output from the following command:           ***
***                                                                ***
***       perl configdata.pm --dump                                ***
***                                                                ***
***   (If you are new to OpenSSL, you might want to consult the    ***
***   'Troubleshooting' section in the INSTALL file first)         ***
***                                                                ***
**********************************************************************
if exist msdo_win64a.bat (                                              msdo_ms
&& "C:Program FilesMicrosoft Visual Studio2022CommunityVCToolsMSVC14.30.30705binHostX64x64nmake.exe" -f msnt.mak                                   && "C:Program FilesMicrosoft Visual Studio2022CommunityVCToolsMSVC14.30.30705binHostX64x64nmake.exe" -f msnt.mak install                           ) else (
"C:Program FilesMicrosoft Visual Studio2022CommunityVCToolsMSVC14.30.30705binHostX64x64nmake.exe"                                                   && "C:Program FilesMicrosoft Visual Studio2022CommunityVCToolsMSVC14.30.30705binHostX64x64nmake.exe" install_sw                                     )
Microsoft (R) Program Maintenance Utility Version 14.30.30709.0
Copyright (C) Microsoft Corporation.  All rights reserved.
"C:Strawberryperlbinperl.exe" "-I." -Mconfigdata "utildofile.pl"  "-omakefile" "includecryptobn_conf.h.in" > includecryptobn_conf.h
"C:Strawberryperlbinperl.exe" "-I." -Mconfigdata "utildofile.pl"  "-omakefile" "includecryptodso_conf.h.in" > includecryptodso_conf.h
"C:Strawberryperlbinperl.exe" "-I." -Mconfigdata "utildofile.pl"  "-omakefile" "includeopensslopensslconf.h.in" > includeopensslopensslconf.h
"C:Program FilesMicrosoft Visual Studio2022CommunityVCToolsMSVC14.30.30705binHostX64x64nmake.exe" /                   depend && "C:Program FilesMicrosoft Visual Studio2022CommunityVCToolsMSVC14.30.30705binHostX64x64nmake.exe" /                   _all
Microsoft (R) Program Maintenance Utility Version 14.30.30709.0
Copyright (C) Microsoft Corporation.  All rights reserved.

Microsoft (R) Program Maintenance Utility Version 14.30.30709.0
Copyright (C) Microsoft Corporation.  All rights reserved.
"C:Strawberryperlbinperl.exe" "utilmkbuildinf.pl" "cl /Zi /Fdossl_static.pdb /MT /Zl /Gs0 /GF /Gy /W3 /wd4090 /nologo /O2 -D"L_ENDIAN" -D"OPENSSL_PIC"" "VC-WIN64A" > cryptobuildinf.h
cl  /Zi /Fdossl_static.pdb /MT /Zl /Gs0 /GF /Gy /W3 /wd4090 /nologo /O2 /I "." /I "include" /I "crypto" -D"L_ENDIAN" -D"OPENSSL_PIC" -D"OPENSSLDIR="C:\nginx\objs\lib\openssl-1.1.1m\openssl\ssl"" -D"ENGINESDIR="C:\nginx\objs\lib\openssl-1.1.1m\openssl\lib\engines-1_1"" -D"OPENSSL_SYS_WIN32" -D"WIN32_LEAN_AND_MEAN" -D"UNICODE" -D"_UNICODE" -D"_CRT_SECURE_NO_DEPRECATE" -D"_WINSOCK_DEPRECATED_NO_WARNINGS" -D"NDEBUG"  -c /Focryptocversion.obj "cryptocversion.c"
cversion.c
cl  /Zi /Fdossl_static.pdb /MT /Zl /Gs0 /GF /Gy /W3 /wd4090 /nologo /O2 /I "." /I "include" /I "crypto" -D"L_ENDIAN" -D"OPENSSL_PIC" -D"OPENSSLDIR="C:\nginx\objs\lib\openssl-1.1.1m\openssl\ssl"" -D"ENGINESDIR="C:\nginx\objs\lib\openssl-1.1.1m\openssl\lib\engines-1_1"" -D"OPENSSL_SYS_WIN32" -D"WIN32_LEAN_AND_MEAN" -D"UNICODE" -D"_UNICODE" -D"_CRT_SECURE_NO_DEPRECATE" -D"_WINSOCK_DEPRECATED_NO_WARNINGS" -D"NDEBUG"  /Zs /showIncludes "cryptocversion.c" 2>&1 > cryptocversion.d
lib /nologo /out:libcrypto.lib @C:UsersWillAppDataLocalTempnm8B87.tmp
cryptocversion.obj : fatal error LNK1112: module machine type 'x64' conflicts with target machine type 'x86'
NMAKE : fatal error U1077: '"C:Program FilesMicrosoft Visual Studio2022CommunityVCToolsMSVC14.30.30705binHostX64x64lib.EXE"' : return code '0x458'
Stop.
NMAKE : fatal error U1077: '"C:Program FilesMicrosoft Visual Studio2022CommunityVCToolsMSVC14.30.30705binHostX64x64nmake.exe"' : return code '0x2'
Stop.
NMAKE : fatal error U1077: 'if' : return code '0x2'
Stop.
NMAKE : fatal error U1077: '"C:Program FilesMicrosoft Visual Studio2022CommunityVCToolsMSVC14.30.30705binHostX64x64nmake.exe"' : return code '0x2'
Stop.
NMAKE : fatal error U1077: '"C:Program FilesMicrosoft Visual Studio2022CommunityVCToolsMSVC14.30.30705binHostX64x64nmake.exe"' : return code '0x2'
Stop.

我哪里错了?

我正在尝试做同样的事情。我设法进一步构建,但仍然遇到了OpenSSL不是从NGINX Makefile构建的问题,但确实使用nmake为x64单独构建了OpenSSL。以下是我的步骤:

1.我从他们的Git repos中查看了以下三个存储库:

(starting at the nginx base folder)
mkdir objs
cd objs
mkdir lib
cd lib
git clone git clone https://github.com/openssl/openssl.git
(renamed base folder to 'openssl')
git clone https://github.com/PCRE2Project/pcre2.git
(generates pcre2-10.40 folder)
git clone https://github.com/madler/zlib.git
(generates zip-1.2.13 folder)

2.更改到openssl文件夹并设置环境变量以进行输出,如基本文件夹中NOTES-WINDOWS.md文件中所述:

set PREFIX=C:Program FilesOpenSSL
set OPENSSLDIR=C:Program FilesCommon FilesSSL
set Platform=x64
set INCLUDE="C:Program FilesMicrosoft Visual Studio2022CommunityVCToolsMSVC14.34.31933include;C:Program FilesMicrosoft Visual Studio2022CommunityVCToolsMSVC14.34.31933ATLMFCinclude;C:Program FilesMicrosoft Visual Studio2022CommunityVCAuxiliaryVSinclude;C:Program Files (x86)Windows Kits10include10.0.22621.0ucrt;C:Program Files (x86)Windows Kits10include10.0.22621.0um;C:Program Files (x86)Windows Kits10include10.0.22621.0shared;C:Program Files (x86)Windows Kits10include10.0.22621.0winrt;C:Program Files (x86)Windows Kits10include10.0.22621.0cppwinrt;
set LIB=C:Program FilesMicrosoft Visual Studio2022CommunityVCToolsMSVC14.34.31933ATLMFClibx64;C:Program FilesMicrosoft Visual Studio2022CommunityVCToolsMSVC14.34.31933libx64;C:Program Files (x86)Windows KitsNETFXSDK4.8libumx64;C:Program Files (x86)Windows Kits10lib10.0.22621.0ucrtx64;C:Program Files (x86)Windows Kits10lib10.0.22621.0umx64
set LIBPATH=C:Program FilesMicrosoft Visual Studio2022CommunityVCToolsMSVC14.34.31933ATLMFClibx64;C:Program FilesMicrosoft Visual Studio2022CommunityVCToolsMSVC14.34.31933libx64;C:Program FilesMicrosoft Visual Studio2022CommunityVCToolsMSVC14.34.31933libx86storereferences;C:Program Files (x86)Windows Kits10UnionMetadata10.0.22621.0;C:Program Files (x86)Windows Kits10References10.0.22621.0;C:WindowsMicrosoft.NETFramework64v4.0.30319
set PATH=C:/Strawberry/perl/bin;C:Program FilesMicrosoft Visual Studio2022CommunityVCToolsMSVC14.34.31933binHostX64x64;C:Program FilesMicrosoft Visual Studio2022CommunityCommon7IDEVCVCPackages;C:Program FilesMicrosoft Visual Studio2022CommunityCommon7IDECommonExtensionsMicrosoftTestWindow;C:Program FilesMicrosoft Visual Studio2022CommunityCommon7IDECommonExtensionsMicrosoftTeamFoundationTeam Explorer;C:Program FilesMicrosoft Visual Studio2022CommunityMSBuildCurrentbinRoslyn;C:Program FilesMicrosoft Visual Studio2022CommunityTeam ToolsPerformance Toolsx64;C:Program FilesMicrosoft Visual Studio2022CommunityTeam ToolsPerformance Tools;C:Program Files (x86)Microsoft SDKsWindowsv10.0AbinNETFX 4.8 Toolsx64;C:Program Files (x86)HTML Help Workshop;C:Program Files (x86)Windows Kits10bin10.0.22621.0x64;C:Program Files (x86)Windows Kits10binx64;C:Program FilesMicrosoft Visual Studio2022CommunityMSBuildCurrentBinamd64;C:WindowsMicrosoft.NETFramework64v4.0.30319;C:Program FilesMicrosoft Visual Studio2022CommunityCommon7IDE;C:Program FilesMicrosoft Visual Studio2022CommunityCommon7Tools;

3.运行perl-Configure命令

> perl Configure VC-WIN64A no-asm 
Configuring OpenSSL version 3.1.0-beta1-dev for target VC-WIN64A
Using os-specific seed configuration
Created configdata.pm
Running configdata.pm
Created makefile.in
Created makefile
**********************************************************************
***                                                                ***
***   OpenSSL has been successfully configured                     ***
***                                                                ***
***   If you encounter a problem while building, please open an    ***
***   issue on GitHub <https://github.com/openssl/openssl/issues>  ***
***   and include the output from the following command:           ***
***                                                                ***
***       perl configdata.pm --dump                                ***
***                                                                ***
***   (If you are new to OpenSSL, you might want to consult the    ***
***   'Troubleshooting' section in the INSTALL.md file first)      ***
***                                                                ***
**********************************************************************

4.运行nmake

(after 20 minutes of compiling)
...
cmd /C ""cl" /Zs /showIncludes  /Zi /Fdapp.pdb /Gs0 /GF /Gy /MD /W3 /wd4090 /nologo /O2 -I"apps" -I"." -I"include" -I"appsinclude" -D"OPENSSL_BUILDING_OPENSSL" -D"OPENSSL_SYS_WIN32" -D"WIN32_LEAN_AND_MEAN" -D"UNICODE" -D"_UNICODE" -D"_CRT_SECURE_NO_DEPRECATE" -D"_WINSOCK_DEPRECATED_NO_WARNINGS" -D"NDEBUG"   "appsx509.c" > appsopenssl-bin-x509.d 2>&1"
IF EXIST appsopenssl.exe.manifest DEL /F /Q appsopenssl.exe.manifest
"link" /nologo /debug setargv.obj /subsystem:console /opt:ref  /nologo /debug @C:msys64tmpnm1758.tmp

正在创建库应用程序\openssl.lib和对象应用程序\openssl.expIF EXIST apps\openssl.exe.manifest"mt"-nologo-manifest apps\openssl.exe.manifest-outputsource:apps\openssl.exe

5.创建目标文件夹并授予自己对它们的完全控制权

C:Program FilesOpenSSL
C:Program FilesCommon FilesSSL

6.将OpenSSL二进制文件和SSL公共库安装到目标文件夹

> nmake install
*** Installing runtime programs
Copying: apps//openssl.exe to C:/Program Files/OpenSSL/bin/openssl.exe
Copying: apps//openssl.pdb to C:/Program Files/OpenSSL/bin/openssl.pdb
Copying: tools//c_rehash.pl to C:/Program Files/OpenSSL/bin/c_rehash.pl
created directory `C:/Program Files/Common Files/SSL/certs'
created directory `C:/Program Files/Common Files/SSL/private'
created directory `C:/Program Files/Common Files/SSL/misc'
Copying: ./apps/openssl.cnf to C:/Program Files/Common Files/SSL/openssl.cnf.dist
Copying: ./apps/openssl.cnf to C:/Program Files/Common Files/SSL/openssl.cnf
Copying: apps//CA.pl to C:/Program Files/Common Files/SSL/misc/CA.pl
Copying: apps//tsget.pl to C:/Program Files/Common Files/SSL/misc/tsget.pl
Copying: ./apps/ct_log_list.cnf to C:/Program Files/Common Files/SSL/ct_log_list.cnf.dist
Copying: ./apps/ct_log_list.cnf to C:/Program Files/Common Files/SSL/ct_log_list.cnf
...
Copying: ./doc/html/man7/proxy-certificates.html to C:/Program Files/OpenSSL/html/man7/proxy-certificates.html
Copying: ./doc/html/man7/RAND.html to C:/Program Files/OpenSSL/html/man7/RAND.html
Copying: ./doc/html/man7/RSA-PSS.html to C:/Program Files/OpenSSL/html/man7/RSA-PSS.html
Copying: ./doc/html/man7/ssl.html to C:/Program Files/OpenSSL/html/man7/ssl.html
Copying: ./doc/html/man7/X25519.html to C:/Program Files/OpenSSL/html/man7/X25519.html
Copying: ./doc/html/man7/x509.html to C:/Program Files/OpenSSL/html/man7/x509.html

(我稍后将对此进行编辑,以添加到目前为止NGINX构建的其余部分…(

最新更新