OpenSSL-1.1.1-pre5调用EVP_sha3_224出现未定义引用问题求助
解决OpenSSL 1.1.1-pre5中EVP_sha3_224未定义引用的问题
这个错误本质是链接器找不到SHA-3算法的实现代码,不是代码本身的语法问题,我来给你一步步排查解决:
1. 核心原因:编译时未正确链接OpenSSL加密库
EVP_sha3_224这类哈希算法的实现都在OpenSSL的libcrypto库中,编译代码时必须明确告诉链接器要链接这个库,否则就会出现未定义引用错误。
正确的编译命令示例
如果你的OpenSSL是系统默认安装的,直接用gcc编译时加上-lcrypto参数即可:
gcc your_sha3_code.c -o sha3_demo -lcrypto
如果是自定义路径安装的OpenSSL(比如你手动编译安装到了/usr/local/openssl),需要额外指定头文件和库的路径:
gcc -I/usr/local/openssl/include your_sha3_code.c -o sha3_demo -L/usr/local/openssl/lib -lcrypto -Wl,-rpath=/usr/local/openssl/lib
-I:指定OpenSSL头文件的目录-L:指定OpenSSL库文件的目录-Wl,-rpath:让程序运行时能找到自定义安装的库文件
2. 确认OpenSSL编译时启用了SHA-3
虽然OpenSSL 1.1.1系列默认是启用SHA-3的,但如果你是手动编译的1.1.1-pre5,还是要确认编译配置时没禁用它:
- 编译OpenSSL时,配置命令默认包含SHA-3支持,除非你手动加了
no-sha3参数 - 如果之前编译时确实禁用了SHA-3,需要重新编译OpenSSL:
./config enable-sha3 --prefix=/usr/local/openssl make && make install
3. 代码层面的小检查
你已经正确包含了<openssl/evp.h>,这没问题,不过可以确认一下EVP_sha3_224的用法是否符合1.1.1版本的规范,比如完整的SHA-3计算示例应该是这样的:
#define MSG_SIZE 190 #include <stdio.h> #include <string.h> #include <openssl/evp.h> void str2hex(char *str, unsigned char *hex, int len) { int tt, ss; char temp[5]; for (tt = 0, ss = 0; tt < len && ss < 2 * len; tt++, ss += 2) { temp[0] = '0'; temp[1] = 'x'; temp[2] = str[ss]; temp[3] = str[ss + 1]; temp[4] = 0; hex[tt] = strtol(temp, NULL, 16); } } int main() { unsigned char msg[MSG_SIZE] = "test message for SHA-3-224"; unsigned char hash[EVP_MAX_MD_SIZE]; unsigned int hash_len; // 初始化SHA-3-224上下文 EVP_MD_CTX *ctx = EVP_MD_CTX_new(); const EVP_MD *md = EVP_sha3_224(); EVP_DigestInit_ex(ctx, md, NULL); EVP_DigestUpdate(ctx, msg, strlen((char*)msg)); EVP_DigestFinal_ex(ctx, hash, &hash_len); EVP_MD_CTX_free(ctx); // 输出哈希值 printf("SHA-3-224 hash: "); for(int i=0; i<hash_len; i++) { printf("%02x", hash[i]); } printf("\n"); return 0; }
按照上面的步骤调整编译命令,应该就能解决未定义引用的问题了。
内容的提问来源于stack exchange,提问作者user3405360
相关产品推荐
相关产品推荐

