在Window下编译OpenSSL需要安装perl、vs等软件,本教程将以VS2010+Activeperl为示例。
安装ActivePerl
到官网下载对应的运行版本安装即可。
下载并解压OpenSSL源码
到官网下载自己需要的版本,并解压到任意目录,比如 c:\openssl-src
设置VS2010编译环境
打开命令行,执行如下命令:
32位:
1 2
| cd C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin vcvars32.bat
|
64位:
1 2
| cd C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64 vcvars64.bat
|
其中 C:\Program Files (x86)\Microsoft Visual Studio 10.0 是我VS2010安装目录,读者需要把路径修改为本机实际路径。
进入OpenSSL源码目录
配置编译文件
1
| perl Configure debug-VC-WIN32 no-asm --prefix="c:\openssl"
|
其中:
debug-VC-WIN32 表示windows 32位系统,64位系统请换成 debug-VC-WIN64A
Relase 版本去掉debug,改为VC-WIN32或者VC-WIN64A
no-asm 表示不用汇编,不设置此属性会导致编译不过
prefix 表示需要安装的目录
生成编译文件
32位:
64位:
执行这一步之后,在ms目录下会生成 nt.mak 和 ntdll.mak 两个编译配置文件
nt.mak 用于生成静态lib库
ntdll.mak 用于生成动态dll库
编译
静态库
1 2
| nmake -f ms\nt.mak nmake -f ms\nt.mak install
|
动态库
1 2
| nmake -f ms\ntdll.mak nmake -f ms\ntdll.mak install
|
常见错误
1 2 3 4 5
| Assembling: tmp32\sha1-586.asm tmp32\sha1-586.asm(1427) : error A2070: invalid instruction operands tmp32\sha1-586.asm(1571) : error A2070: invalid instruction operands NMAKE : fatal error U1077: 'ml' : return code '0x1' Stop.
|
出现这个问题一般就是因为在编译配置文件的时候没有加上 no-asm 属性导致的
1 2 3 4
| .\ssl\bad_dtls_test.c : error C2220: 警告被视为错误 - 没有生成“object”文件 .\ssl\bad_dtls_test.c : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止 数据丢失 NMAKE : fatal error U1077: “"H:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\BIN\cl.EXE"”: 返回代码“0x2” Stop.
|
出现这个问题是只需要降低警告级别就可以了,打开 ntdll.mak 文件,大概在第19行附近,将 CFLAG 参数中的 /W3 改成 /W0 就可以了
1 2
| cryptlib.obj : error LNK2001: 无法解析的外部符号 _OPENSSL_ia32cap_P cryptlib.obj : error LNK2019: 无法解析的外部符号 _OPENSSL_ia32_cpuid,该符号在函数 _OPENSSL_cpuid_setup 中被引用
|
出现这个问题是因为之前编译的临时文件没有清理导致的,因为我之前编译的时候没有添加no-asm选项,后面加上时没有清理就直接编译了,那肯定有问题。所以重新清理下再编译即可(清理方式就是重新解压一份原来的压缩包,重新来就是了)