GmSSL win10编译安装

本文介绍如何在Windows环境下使用Visual Studio 2015编译安装GmSSL,并解决编译过程中遇到的问题,如无法解析的外部符号错误等。此外,还详细介绍了生成JNI动态链接库的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

准备编译环境

  1. 安装Visual Studio 2015,我使用的是vs2015安装的,过程基本没什么问题,也试过MinGW,遇到一些问题,后来还是用vs2015编译安装的
  2. 安装ActivePerl,百度搜一下去官网下载即可,我使用的是 ActivePerl5.26.1.2601 版本
  3. 安装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
  1. –prefix指定gmssl安装路径
  2. –openssldir指定openssl路径
  3. 如果当前系统是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系统,记录下来,也给大家分享一下,希望大家在编译的时候能少走些弯路

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值