我正在尝试使用openssl库提供的哈希算法。 我安装了openssl和libssl-dev。版本是1.1.0f。 我尝试运行openssl.org网站的示例代码:
#include <stdio.h>
#include <openssl/evp.h>
int main(int argc, char *argv[]){
EVP_MD_CTX *mdctx;
const EVP_MD *md;
char mess1[] = "Test Message\n";
char mess2[] = "Hello World\n";
unsigned char md_value[EVP_MAX_MD_SIZE];
int md_len, i;
if(!argv[1]) {
printf("Usage: mdtest digestname\n");
exit(1);
}
md = EVP_get_digestbyname(argv[1]);
if(!md) {
printf("Unknown message digest %s\n", argv[1]);
exit(1);
}
mdctx = EVP_MD_CTX_new();
EVP_DigestInit_ex(mdctx, md, NULL);
EVP_DigestUpdate(mdctx, mess1, strlen(mess1));
EVP_DigestUpdate(mdctx, mess2, strlen(mess2));
EVP_DigestFinal_ex(mdctx, md_value, &md_len);
EVP_MD_CTX_free(mdctx);
printf("Digest is: ");
for (i = 0; i < md_len; i++)
printf("%02x", md_value[i]);
printf("\n");
exit(0);
}
我尝试用以下方法编译:
gcc digest_example.c -lcrypto -lssl
编译器给出错误:
digest_example.c:(.text+0xbc): undefined reference to `EVP_MD_CTX_new'
digest_example.c:(.text+0x138): undefined reference to `EVP_MD_CTX_free'
collect2: error: ld returned 1 exit status
老实说,我很无能为力。我通过编译从网站上安装并重新安装了2次OpenSSL。此外,所有其他命令没有问题。就是这两个。链接时是否必须使用其他库?
感谢您的帮助。
答案 0 :(得分:7)
您似乎使用的是旧版本的openssl(&lt; 1.1.0)。也许您已下载并安装了较新的版本,但您的链接器似乎找到并使用旧版本的openssl库。
1.1.0中的 EVP_MD_CTX_new()
已取代1.0.x中的EVP_MD_CTX_create()
。
EVP_MD_CTX_free()
已取代1.0.x中的EVP_MD_CTX_destroy()
。
您可能会尝试使用这些函数的旧版本,或确保您的链接器确实使用了openssl库的&gt; = 1.1.0版本。
答案 1 :(得分:0)
版本是1.1.0f。我尝试运行openssl.org网站的示例代码......
我通过编译安装并重新安装OpenSSL 2次来自网站......
我相信OpenSSL 1.1.0安装到/usr/local/ssl
。标题位于/usr/local/ssl/include
,lib位于/usr/local/ssl/lib
。您需要编译并链接:
gcc -I /usr/local/ssl digest_example.c -Wl,-L,/usr/local/lib -lssl -lcrypto
事实上,因为Linux路径是f ** k'd up,所以需要添加RPATH,以便在运行时链接到正确的库(而不是编译时)。所以你真的需要以下内容,因为Linux在30年后仍然无法正常运行:
gcc -I /usr/local/ssl digest_example.c -Wl,-rpath,/usr/local/lib -Wl,-L,/usr/local/lib -lssl -lcrypto
您仍然需要正确获取库的顺序,因为LD是单通道链接器。
您的命令与系统的OpenSSL版本链接,即1.0.2。
gcc digest_example.c -lcrypto -lssl
然而,图书馆的顺序是错误的。这些库应该被称为-lssl -lcrypto
。