如何在Windows上编译OpenSSL?

我一直遵循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时。

在我提到的同样的博客页面上,我也描述了“不要asm”的情况 – 这种情况编译起来更简单(根本不需要nasm),但是缺点是 – 一些算法的性能比汇编程序版本。 如果你的情况可以接受这个表现 – 尝试编译“不要asm”的情况。

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

我使用以下命令(显示了调试版本),在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 

我知道这是一个旧的帖子,但对于其他有NASM解析错误的问题,这里的解决方案是:

一旦你运行了ms \ do_ms.bat(使用masm)或者ms \ do_nasm.bat(使用nasm),你不能直接切换到另一个,而不先清空tmp32目录,否则perl将永远不会重新生成.asm文件正确。 你得到的解析器错误来自nasm试图组装masm格式的文件。

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