如何在Windows上编译OpenSSL?

6

我一直在遵循OpenSSL用户指南中的说明,该指南链接到3noch的指南以编译OpenSSL。以下是我使用的工具/版本:

  • ActiveState Perl v5.20.2
  • Microsoft Visual Studio 2012
  • Netwide Assembler (NASM) v2.12.02
  • OpenSSL 1.0.2j(源代码tarball)

按照说明,我能够顺利执行以下命令:

perl Configure VC-WIN32 --prefix=C:\Build-OpenSSL-VC-32
ms\do_ms

然后,当我继续执行时
nmake -f ms\nt.mak

我收到了以下内容。
 Assembling: tmp32\sha1-586.asm
tmp32\sha1-586.asm(1432) : error A2070:invalid instruction operands
tmp32\sha1-586.asm(1576) : error A2070:invalid instruction operands
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 11.0
\VC\BIN\ml.EXE"' : return code '0x1'
Stop.

在调查该问题后,我发现HostageBrain的博客文章提到了这个错误,并建议使用nasm进行编译。所以,我切换到了以下命令序列:

perl Configure VC-WIN32 --prefix=C:\Build-OpenSSL-VC-32
ms\do_nasm
nmake -f ms\nt.mak

然而,一旦转换为NASM版本,我会收到以下错误:
tmp32\sha1-586.asm:1: error: parser: instruction expected
tmp32\sha1-586.asm:2: error: parser: instruction expected
tmp32\sha1-586.asm:3: error: parser: instruction expected
tmp32\sha1-586.asm:4: warning: label alone on a line without a colon might be in error
tmp32\sha1-586.asm:5: warning: label alone on a line without a colon might be in error
tmp32\sha1-586.asm:6: warning: label alone on a line without a colon might be in error
tmp32\sha1-586.asm:7: error: symbol `IF' redefined
tmp32\sha1-586.asm:7: error: parser: instruction expected
tmp32\sha1-586.asm:8: error: parser: instruction expected
tmp32\sha1-586.asm:9: error: comma expected after operand 1

我想要的是将OpenSSL编译成.lib文件,以便在其他C++项目中链接,例如编译FreeTDS时使用。

你需要打开一个32位Visual Studio开发者命令提示符。并且确保NASM已经在路径中。对于ml.exe的引用表示使用MASM,而不是NASM。*sha1-586.asm:1: error: parser: instruction expected*消息似乎表明出现了Perl的问题。我相信在Configure期间运行了一个OpenSSL脚本,用于修复汇编程序的ASM问题。你可以尝试使用最新的Active Perl(5.24)或Strawberry Perl(5.24)吗?更改后,你需要清理并重新配置。 - jww
4个回答

4

在你提到的我的博客页面上,我也描述了“no-asm”情况 - 这种情况更容易编译(根本不需要nasm),但缺点是一些算法的性能将比汇编版本慢2倍至4倍。 如果你的情况可以接受这种性能 - 尝试编译“no-asm”情况。

perl Configure VC-WIN32 no-asm --prefix=C:\Build-OpenSSL-VC-32

2

我使用以下命令(显示调试构建)在Windows 10上的VS 2015常规命令提示符中构建了该库:

"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64\vcvars64.bat"
perl Configure debug-VC-WIN64A --prefix=C:\Path\to\target\folder
ms\do_win64a
nmake -f ms\ntdll.mak
cd out32dll.dbg
..\ms\test
cd ..
nmake -f ms\ntdll.mak install

按照这些指示(将VS版本更改为11以匹配我的版本),我能够编译64位版本,但我仍然无法编译32位版本(我需要使用的其他库是32位的,而且我需要OpenSSL是32位的,以便与其他内容编译得更好)。 - Alex
2
你尝试过使用 perl Configure VC-WIN32 no-asm --prefix=c:/some/openssl/dir 来构建没有汇编的 OpenSSL 吗? - wally

2

我知道这是一篇旧文章,但对于其他遇到NASM解析错误问题的人,这里有解决方案:

一旦你运行ms\do_ms.bat(使用masm)或ms\do_nasm.bat(使用nasm),你就不能直接切换到另一个而不先清除tmp32目录,否则perl将无法正确地重新生成.asm文件。你遇到的解析器错误来自于nasm试图汇编一个masm格式的文件。

清空tmp32最简单的方法是运行“nmake -f ms\nt.mak clean”。


1
回答这个非常古老的问题。在x64下构建它会遇到一些问题,包括“未找到汇编程序”,下载NASM并添加到路径等。使用MSYS2有一个非常好的简单解决方案。
安装MSYS2。确保您获得所需的工具链(请参见pacman指南)。然后按照以下步骤操作 $启动msys2_shell.cmd-mingw64 $wget -c ftp://ftp.pca.dfn.de/pub/tools/net/openssl/source/openssl-1.0.2o.tar.gz $tar -xzvf openssl-1.0.2o.tar.gz openssl-1.0.2o/ $cd openssl-1.0.2o/ $./configure shared mingw64 $make 就是这样。在应用程序目录中,您将获得openssl可执行文件以及库。
-Sreejith.D.Menon

谢谢您的提示。除了base-devel,您能否提供其他建议来安装pacman软件包以使其正常工作?我正在尝试编译openssl的fips-2.0.14版本。我已经添加了libcrypt-devel,但仍然出现以下错误:make[1]: gcc: No such file or directory make[1]: *** [<builtin>: cryptlib.o] Error 127 make[1]: Leaving directory '/c/users/mitch/openssl-OpenSSL-fips-2_0_14/crypto' make: *** [Makefile:367: build_crypto] Error 1 - guitarpicva
也许我的MYSY2环境还不完整。 ;) - guitarpicva

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