准备编译一个开源工程, git下来看说明, 说要openSSL.
那就先编译openSSL.
开源工程说的挺NB的, 要用户git最新版的openSSL:)
一般开源软件只敢说, 本软件要某个第三方库的某个特定范围的版本:P
Win7X64SP1
vs2013
nasm
因为是自己的开发机, 杂7杂8的装了好多(vc6, vs2010,android开发环境, 不知道对编译过程是否有负面影响), 也没有搞一个干净的编译环境(太费时间了, 硬盘空间也不太够装虚拟机, 新硬盘还没挂上去). 我自己能编译的过就够了.
用vs2010编译不过
用vs2013命令行(VS2013 x86 Native Tools Command Prompt)可以编译过
no-shared 选项不行, 不能加, 编译不过去.
openSSL的编译要用activeperl
下载activeperl
http://www.activestate.com/activeperl
下载x64版 :
http://downloads.activestate.com/ActivePerl/releases/5.24.1.2402/ActivePerl-5.24.1.2402-MSWin32-x64-401627.exe
安装ActivePerl-5.24.1.2402-MSWin32-x64-401627.exe到D:\Perl64, 安装时跳过新版本检测,全部安装.
https://www.openssl.org/source/
版本, 1.0.1h以上, 选最新版本.
https://github.com/openssl/openssl.git
迁出到D:\3rd\openssl
编译指南: D:\3rd\openssl\NOTES.WIN
OpenSSL编译需要nasm(http://www.nasm.us), 下载安装到c:\nasm, 将nasm.exe加入环境变量.
建立文件夹 d:\openssl-static-lib, 用于存放openSSL输出文件. 准备编译openSSL静态库.
打开vs2013的x86本地工具命令行(VS2013 x86 Native Tools Command Prompt), 运行下列命令
cd D:\3rd\openssl
d:
perl Configure VC-WIN32 –prefix=d:\openssl-static-lib
d:\3rd\openssl>perl Configure VC-WIN32 --prefix=d:\openssl-static-lib
Configuring OpenSSL version 1.1.1-dev (0x10101000L)
no-aria [default] OPENSSL_NO_ARIA (skip dir)
no-asan [default] OPENSSL_NO_ASAN
no-crypto-mdebug [default] OPENSSL_NO_CRYPTO_MDEBUG
no-crypto-mdebug-backtrace [default] OPENSSL_NO_CRYPTO_MDEBUG_BACKTRACE
no-ec_nistp_64_gcc_128 [default] OPENSSL_NO_EC_NISTP_64_GCC_128
no-egd [default] OPENSSL_NO_EGD
no-external-tests [default] OPENSSL_NO_EXTERNAL_TESTS
no-fuzz-afl [default] OPENSSL_NO_FUZZ_AFL
no-fuzz-libfuzzer [default] OPENSSL_NO_FUZZ_LIBFUZZER
no-heartbeats [default] OPENSSL_NO_HEARTBEATS
no-md2 [default] OPENSSL_NO_MD2 (skip dir)
no-msan [default] OPENSSL_NO_MSAN
no-rc5 [default] OPENSSL_NO_RC5 (skip dir)
no-sctp [default] OPENSSL_NO_SCTP
no-ssl-trace [default] OPENSSL_NO_SSL_TRACE
no-ssl3 [default] OPENSSL_NO_SSL3
no-ssl3-method [default] OPENSSL_NO_SSL3_METHOD
no-tls13downgrade [default] OPENSSL_NO_TLS13DOWNGRADE
no-tls1_3 [default] OPENSSL_NO_TLS1_3
no-ubsan [default] OPENSSL_NO_UBSAN
no-unit-test [default] OPENSSL_NO_UNIT_TEST
no-weak-ssl-ciphers [default] OPENSSL_NO_WEAK_SSL_CIPHERS
no-zlib [default]
no-zlib-dynamic [default]
Configuring for VC-WIN32
It looks like you don't have either nmake.exe or dmake.exe on your PATH,
so you will not be able to execute the commands from a Makefile. You can
install dmake.exe with the Perl Package Manager by running:
ppm install dmake
PERL =D:\Perl64\bin\perl.exe
PERLVERSION =5.24.1 for MSWin32-x64-multi-thread
HASHBANGPERL =/usr/bin/env perl
CC =cl
CFLAG =-W3 -wd4090 -Gs0 -GF -Gy -nologo -DOPENSSL_SYS_WIN32 -DWIN32_LEAN
_AND_MEAN -DL_ENDIAN -D_CRT_SECURE_NO_DEPRECATE -DUNICODE -D_UNICODE /MD /O2
CXX =c++
CXXFLAG =-W3 -wd4090 -Gs0 -GF -Gy -nologo -DOPENSSL_SYS_WIN32 -DWIN32_LEAN
_AND_MEAN -DL_ENDIAN -D_CRT_SECURE_NO_DEPRECATE -DUNICODE -D_UNICODE /MD /O2
DEFINES =OPENSSL_USE_APPLINK DSO_WIN32 NDEBUG OPENSSL_THREADS OPENSSL_NO_S
TATIC_ENGINE OPENSSL_PIC OPENSSL_BN_ASM_PART_WORDS OPENSSL_IA32_SSE2 OPENSSL_BN_
ASM_MONT OPENSSL_BN_ASM_GF2m SHA1_ASM SHA256_ASM SHA512_ASM RC4_ASM MD5_ASM RMD1
60_ASM AES_ASM VPAES_ASM WHIRLPOOL_ASM GHASH_ASM ECP_NISTZ256_ASM PADLOCK_ASM PO
LY1305_ASM
EX_LIBS =ws2_32.lib gdi32.lib advapi32.lib crypt32.lib user32.lib
“perl Configure VC-WIN32 –prefix=d:\openssl-static-lib”命令运行后,如果没报错,
就生成了D:\3rd\openssl\makefile文件
运行如下命令, 开始编译openSSL
nmake -f makefile
时间还挺长的,等着编译完.
编译完没看到报错, 但是也没有提示编译成功, 测试用例全部通过的信息.
运行openSSL的testcase, 看是否全部测试通过.
nmake test
运行命令 “nmake -f makefile install”
nmake -f makefile install
安装完后, D:\openssl-static-lib有了编译好的openSSL
D:\openssl-static-lib>tree
卷 dat 的文件夹 PATH 列表
卷序列号为 66A6-68F9
D:.
├─bin
├─html
│ ├─man1
│ ├─man3
│ ├─man5
│ └─man7
├─include
│ └─openssl
└─lib
└─engines-1_1
因为是用vs2013命令行编译的openSSL.
就用vs2013写个测试程序测试一下,是否openSSL库有效. 测试过了, 编译通过, openSSL函数好使.
但是发现新版openSSL函数和旧版不兼容, 这挺烦人的…
// testOpenSSL.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include
// IDE : vs2013
// inc目录 : D:\openssl-static-lib\include
// lib目录 : D:\openssl-static-lib\lib
// 编译选项 /MT or /MTD
// 将 libcrypto - 1_1.dll, libssl-1_1.dll拷贝到exe统计目录
#include
#include
#include // for CRYPTO_malloc_init
#include
#include
#pragma comment(lib, "libcrypto.lib")
#pragma comment(lib, "libssl.lib")
void OpenSslBegin();
void OpenSslEnd();
int _tmain(int argc, _TCHAR* argv[])
{
OpenSslBegin();
// use openSSL...
printf("openSSL1.1.1 info:\n");
printf("%s\n", SSLeay_version(OPENSSL_VERSION));
printf("%s\n", SSLeay_version(OPENSSL_CFLAGS));
printf("%s\n", SSLeay_version(OPENSSL_BUILT_ON));
printf("%s\n", SSLeay_version(OPENSSL_PLATFORM));
printf("%s\n", SSLeay_version(OPENSSL_DIR));
printf("%s\n", SSLeay_version(OPENSSL_ENGINES_DIR));
/** run result
openSSL1.1.1 info:
OpenSSL 1.1.1-dev xx XXX xxxx
compiler: cl " "VC-WIN32
built on: reproducible build, date unspecified
platform:
OPENSSLDIR: "C:\Program Files (x86)\Common Files\SSL"
ENGINESDIR: "D:\openssl-static-lib\lib\engines-1_1"
*/
OpenSslEnd();
printf("END\n");
system("pause");
return 0;
}
void OpenSslBegin()
{
OPENSSL_malloc_init(); // 不向下兼容, CRYPTO_malloc_init 没了...
// 不兼容的代码, 旧版openSSL是好使的
// ERR_load_crypto_strings();
// OpenSSL_add_all_algorithms();
// ENGINE_load_builtin_engines();
}
void OpenSslEnd()
{
CONF_modules_unload(1);
EVP_cleanup();
ENGINE_cleanup();
CRYPTO_cleanup_all_ex_data();
ERR_remove_state(0);
ERR_free_strings();
}
本来要编译openSSL静态库, 编译出来发现还是使用openSSL动态库.
可能是”perl Configure VC-WIN32 –prefix=d:\openssl-static-lib”还要加参数指定编译openSSL静态库, 以后再研究. openSSL自带的文档没仔细看不行啊, 这试验做的太糙了. 对自己很不满意:P