undefined reference to `hmac_sm3' collect2: error: ld returned 1 exit status
时间: 2023-11-03 08:00:11 浏览: 49
这个错误是连接器(ld)报告的错误,表明在链接过程中找不到名为'hmac_sm3'的函数或符号。可能是由于以下原因之一导致的:
1. 缺少对'hmac_sm3'函数的定义或实现。请确保在代码中包含了正确的函数定义或实现。
2. 缺少对包含'hmac_sm3'函数实现的库文件的链接。请检查是否正确链接了包含'hmac_sm3'函数实现的库文件。
3. 如果'hmac_sm3'函数是在其他代码文件中定义的,可能需要将该文件添加到编译器的源文件列表中,以确保它被编译和链接到最终可执行文件中。
请检查以上原因,确保正确定义、实现和链接'hmac_sm3'函数。如果问题仍然存在,请提供更多关于您的代码和编译环境的信息,以便我能够提供更具体的帮助。
相关问题
undefined symbol: crypto_policy_set_aes_cm_128_hmac_sha1_32
这个错误提示表明在加载`res_srtp.so`模块时出现了问题。错误信息显示了一个未定义的符号`crypto_policy_set_aes_cm_128_hmac_sha1_32`。
这通常意味着在加载`res_srtp.so`模块之前,需要先加载依赖的加密库。你可以尝试通过以下步骤解决这个问题:
1. 确保已经安装了所需的依赖库。在这种情况下,`res_srtp.so`模块依赖于OpenSSL库,请确保已正确安装了OpenSSL库。
2. 检查Asterisk的配置文件,确保正确地指定了依赖库的路径。你可以在Asterisk的配置文件中找到类似`preload => res_srtp.so`的行,检查是否有指定正确的库路径。
3. 如果你已经安装了正确版本的依赖库并且配置文件正确,但仍然无法加载模块,那可能是因为Asterisk编译时没有包含所需的符号。在这种情况下,你可能需要重新编译或重新安装Asterisk,并确保编译过程中包含了正确的选项和依赖。
如果以上步骤不能解决问题,建议你查看Asterisk的文档或寻求相关社区的帮助,以获取更详细的指导和支持。
hmac_sha1函数
HMAC-SHA1 是一种基于 SHA-1 哈希算法的消息认证码算法,用于对消息进行完整性和真实性验证。以下是一个 C++ 实现的 HMAC-SHA1 函数:
```c++
#include <openssl/hmac.h>
#include <openssl/sha.h>
std::string hmac_sha1(const std::string& key, const std::string& message) {
unsigned char digest[SHA_DIGEST_LENGTH];
HMAC_CTX ctx;
HMAC_CTX_init(&ctx);
HMAC_Init_ex(&ctx, key.c_str(), key.length(), EVP_sha1(), NULL);
HMAC_Update(&ctx, (unsigned char*) message.c_str(), message.length());
unsigned int len = SHA_DIGEST_LENGTH;
HMAC_Final(&ctx, digest, &len);
HMAC_CTX_cleanup(&ctx);
char mdString[SHA_DIGEST_LENGTH*2+1];
for(int i = 0; i < SHA_DIGEST_LENGTH; i++)
sprintf(&mdString[i*2], "%02x", (unsigned int)digest[i]);
return std::string(mdString);
}
```
其中,`HMAC_Init_ex()` 函数初始化 HMAC 上下文,`HMAC_Update()` 函数更新 HMAC 上下文,`HMAC_Final()` 函数完成 HMAC 计算,`HMAC_CTX_cleanup()` 函数清理 HMAC 上下文。`EVP_sha1()` 是 OpenSSL 中实现 SHA-1 哈希算法的函数。该函数将返回一个 EVP_MD 结构体,可以传递给 HMAC_Init_ex() 函数来指定使用 SHA-1 哈希算法计算 HMAC。
请注意,此实现使用了 OpenSSL 库,需要在编译时链接 OpenSSL 库。