You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:59:45