编译环境:VS2012+OpenSSL 1.0.2n
首先需要安装Perl,并下载源码,然后开始编译。
(1) 打开对应的32位或者64位VS命令行(推荐用管理员打开,也许不需要)进入OPENSSL目录
(2) 配置编译文件
perl Configure debug-VC-WIN32 no-asm --prefix="d\OpenSSL"
其中:
debug-VC-WIN32 表示windows 32位系统,64位系统请换成 debug-VC-WIN64A
Relase版本去掉debug,改为VC-WIN32或者VC-WIN64A
no-asm 表示不用汇编,不设置此属性会导致编译不过
prefix 表示需要安装的目录
(3) 生成编译文件
对于32位:
ms\do_ms.bat
对于64位:
ms\do_win64a.bat
执行完之后,在ms目录下会生成 nt.mak 和 ntdll.mak 两个编译配置文件,nt.mak 用于生成静态lib库,ntdll.mak 用于生成动态dll库
(4) 编译
动态库:
nmake -f ms\ntdll.mak
nmake -f ms\ntdll.mak install
静态库:
nmake -f ms\nt.mak
nmake -f ms\nt.mak install
(5) 关于编译问题的说明
- 在以上步骤中,我通过设置no-asm跳过了汇编过程,并使用do_ms而不是do_nasm。这种做法是避免了由于openssl版本过高引起的一些问题,主要表现为使用nasm编译会报告Fatal error,错误在ml或者nmake.exe等。
- 若出现如下错误:
.\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”
则需打开ntdll.mak或者nt.mak,在20行调整CFLAG参数,降低警告级别。将W3改为W0可以解决。 - 遇到error LNK2001: 无法解析的外部符号 _OPENSSL_ia32cap_P
等无法解析的外部符号,多由于前次的编译失败、临时文件未清理导致,所以需要养成makefile之前先clean的好习惯。