Windows编译安装GmSSL
- 准备编译环境
- 编译之前有个问题得说一下
- 编译安装GmSSL
-
- 1.生成makefile文件
- 2.安装到指定路径,比如第一步指定的--prefix=D:/C++/gmssl
- 生成jni所需的动态链接库
准备编译环境
- 安装Visual Studio 2015,我使用的是vs2015安装的,过程基本没什么问题,也试过MinGW,遇到一些问题,后来还是用vs2015编译安装的
- 安装ActivePerl,百度搜一下去官网下载即可,我使用的是 ActivePerl5.26.1.2601 版本
- 安装nasm,网址https://www.nasm.us/
编译之前有个问题得说一下
直接编译的话可能会遇到如下错误
libcrypto-1_1.def : error LNK2001: 无法解析的外部符号 EVP_get_ciphernames
libcrypto-1_1.def : error LNK2001: 无法解析的外部符号 EVP_get_digestnames
处理方式是从gmssl.git 仓库中找到 names2.c,查看该文件的历史版本,原来的版本里面有如下代码,追加到该文件尾部即可。该文件在 GmSSL-master/crypto/evp/names2.c 路径下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | static void cipher_name_len(const EVP_CIPHER *cipher, const char *from, const char *to, void *x) {<!-- --> *((int *)x) += strlen(EVP_CIPHER_name(cipher)); } static void cipher_name(const EVP_CIPHER *cipher, const char *from, const char *to, void *x) {<!-- --> strcat((char *)x, EVP_CIPHER_name(cipher)); } char *EVP_get_ciphernames(int aliases) {<!-- --> char *ret = NULL; int len = 0; EVP_CIPHER_do_all_sorted(cipher_name_len, &len); ret = OPENSSL_zalloc(len); if (!ret) {<!-- --> return NULL; } EVP_CIPHER_do_all_sorted(cipher_name, ret); return ret; } char *EVP_get_digestnames(int aliases) {<!-- --> return "sm3:sha1:sha256"; } |
编译安装GmSSL
1.生成makefile文件
1 | perl Configure VC-WIN64A --prefix=D:/C++/gmssl --openssldir=D:/C++/gmssl/openssl |
- –prefix指定gmssl安装路径
- –openssldir指定openssl路径
- 如果当前系统是64位使用VC-WIN64A,如果当前系统是32使用VC-WIN32
2.安装到指定路径,比如第一步指定的–prefix=D:/C++/gmssl
1 | make |
1 | make install |
此时会在D盘C++目录下生成gmssl目录,与在linux环境下编译安装类似,将可执行文件gmssl.exe复制到了gmssl/bin目录
生成jni所需的动态链接库
在前两步编译安装gmssl的过程较为顺利,只需将vs2015正常安装,然后执行3个命令即可。但是我在生成jni动态库的时候花了一天时间,主要被GmSSL github上面搜到的issue干扰了。上面有各种编译动态库的说明,用vs自带的cl编译,或者用mingw的gcc编译等等。我尝试了好多次,都遇到一些问题。后来我发现GmSSL-master/java/目录下有一个winmake文件,我想估计是windows下的makefile,我就把它重命名成makefile,然后使用vs2015自带的nmake
注意,执行nmake的时候不能使用windows+R调出cmd执行,得在vs2015里面找到"VS2015 x64本机工具命令提示符"里面执行,否则会报错找不到stdio.h
执行了一下,gmssljni.dll 动态库文件成功生成。浪费了一天时间,真是的。当我使用这个winmake文件生成动态库成功之后,我又使用
1 | gcc -shared -fPIC -Wall -I./jni -I ../include -L ../ GmSSL.c -lcrypto -o libgmssljni.dll |
命令执行了一下,发现此时生成 libgmssljni.dll 也可以了,真是无语了我,之前尝试了几个小时就是报错,提示一大堆
undefined reference to `OPENSSL_sk_num’
类似的错误,控制台都打印满了。在此,吐槽一下windows系统,记录下来,也给大家分享一下,希望大家在编译的时候能少走些弯路