【发布时间】:2017-10-16 10:25:07
【问题描述】:
我正在尝试使用 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
老实说,我一无所知。我通过编译从网站安装并重新安装了 OpenSSL 2 次。此外,所有其他命令都没有问题。就这两个。链接时是否必须使用其他库?
感谢您的帮助。
【问题讨论】:
-
使用
gcc digest_example.c -lssl -lcrypto,不gcc digest_example.c -lcrypto -lssl。 LD 是单通道链接器。libssl依赖于libcrypto,所以libcrypto需要跟随libssl。另一种方法是使用--start-group <archives> --end-group链接器选项。另请参阅ld(1)手册页。 -
-lssl 和 -lcrypto 的顺序没有使它起作用。我把它们都换了,没有任何区别。看来,链接器和标头使用了不同的 OpenSSL 库。
-
OpenSSL 1.1.0 标头和库位于您的计算机上时的状态。注意:我知道的所有发行版都提供 OpenSSL 1.0.2;不是 OpenSSL 1.1.0。
-
它提供了 1.0.2 。但我想使用 1.1.0,所以我从 openssl.org 下载了二进制文件并编译了它们。但似乎,在系统库中它仍然是旧版本。