编译环境:

操作系统:Windows 10 64位,版本号1803

MinGW版本:MinGW32 6.3.0

GCC版本:gcc.exe (MinGW.org GCC-6.3.0-1) 6.3.0

Perl版本:v5.8.8 built for msys-64int

第一步:安装MinGW

由于MinGW已经停止维护,建议安装MinGW-w64,即64位版本。

方法一:下载打包好的exe安装包,参考这篇文章

方法二:从MinGW-64官网下载安装包

第二步:下载OpenSSL源代码

访问OpenSSL官网下载源代码。下载到的源码包应为tar.gz后缀名的。

第三步:编译静态库

参考这篇文章

双击运行X:\...MinGW目录...\msys\1.0\msys.bat,打开MinGW的shell

然后执行以下命令:

# 解压源码包(因为压缩包中有软链接,不建议用Windows的解压缩工具解压,还是用tar比较稳一点)
tar -zxvf openssl-1.x.x.tar.gz
# 进入openssl目录
cd openssl-1.x.x
# 配置编译选项,输出静态库
./config -fPIC no-shared
# 编译
make -j 4

最终在OpenSSL目录下得到libcrypto.alibssl.a两个静态库,完成。

中途遇到的问题

make命令之后马上就编译出错了,控制台输出内容如下:

making all in crypto...
make[1]: Entering directory `/d/openssl-1.0.2q/crypto'
make[1]: warning: jobserver unavailable: using -j1.  Add `+' to parent make rule.
/bin/perl.exe ../util/mkbuildinf.pl "gcc -I. -I.. -I../include  -D_WINDLL -DOPENSSL_USE_APPLINK -DOPENSSL_PIC -DOPENSSL_THREADS -D_MT -DDSO_WIN32 -DL_ENDIAN -DWIN32_LEAN_AND_MEAN -fomit-frame-pointer -O3 -march=i486 -Wall -DOPENSSL_BN_ASM_PART_WORDS -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_GF2m -DRC4_ASM -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DRMD160_ASM -DAES_ASM -DVPAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM" "mingw" >buildinf.h
gcc -I. -I.. -I../include  -D_WINDLL -DOPENSSL_USE_APPLINK -DOPENSSL_PIC -DOPENSSL_THREADS -D_MT -DDSO_WIN32 -DL_ENDIAN -DWIN32_LEAN_AND_MEAN -fomit-frame-pointer -O3 -march=i486 -Wall -DOPENSSL_BN_ASM_PART_WORDS -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_GF2m -DRC4_ASM -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DRMD160_ASM -DAES_ASM -DVPAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM   -c -o cryptlib.o cryptlib.c
cryptlib.c: In function 'OPENSSL_isservice':
cryptlib.c:840:27: error: 'ERROR_INSUFFICIENT_BUFFER' undeclared (first use in this function)
         GetLastError() != ERROR_INSUFFICIENT_BUFFER)
                           ^~~~~~~~~~~~~~~~~~~~~~~~~
cryptlib.c:840:27: note: each undeclared identifier is reported only once for each function it appears in
make[1]: *** [cryptlib.o] Error 1
make[1]: Leaving directory `/d/openssl-1.0.2q/crypto'
make: *** [build_crypto] Error 1

报错为某个函数使用了一个未定义的标签“ERROR_INSUFFICIENT_BUFFER”,上谷歌查到解决方案:https://github.com/openssl/openssl/issues/5327#issuecomment-389408733,大约是缺少某个低版本的dll,使用以下命令获得:

mingw-get upgrade "w32api<5.0.2"

然后重新编译,顺利解决问题。