Windows编译安装GmSSL
准备编译环境
- 安装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 路径下
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文件
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
make
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文件生成动态库成功之后,我又使用
gcc -shared -fPIC -Wall -I./jni -I ../include -L ../ GmSSL.c -lcrypto -o libgmssljni.dll
命令执行了一下,发现此时生成 libgmssljni.dll 也可以了,真是无语了我,之前尝试了几个小时就是报错,提示一大堆
undefined reference to `OPENSSL_sk_num’
类似的错误,控制台都打印满了。在此,吐槽一下windows系统,记录下来,也给大家分享一下,希望大家在编译的时候能少走些弯路