【发布时间】:2017-03-27 16:01:07
【问题描述】:
我是 OpenSSL 的新手,我正在尝试编译我在他们的文档中找到的 this example。示例逐字如下:
#include <stdio.h>
#include <openssl/evp.h>
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] == NULL) {
printf("Usage: mdtest digestname\n");
exit(1);
}
md = EVP_get_digestbyname(argv[1]);
if (md == NULL) {
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 example.c -lssl -lcrypto
我得到以下输出:
example.c: In function ‘main’:
example.c:25:7: warning: assignment makes pointer from integer without a cast [enabled by default]
mdctx = EVP_MD_CTX_new();
^
example.c:27:32: warning: incompatible implicit declaration of built-in function ‘strlen’ [enabled by default]
EVP_DigestUpdate(mdctx, mess1, strlen(mess1));
^
/tmp/ccWb0D5B.o: In function `main':
example.c:(.text+0xc4): undefined reference to `EVP_MD_CTX_new'
example.c:(.text+0x151): undefined reference to `EVP_MD_CTX_free'
collect2: error: ld returned 1 exit status
那么我缺少哪些库?我花了一些时间搜索这个,但我看到的所有答案都只是使用-lssl -lcrypto 的变体。谢谢。
【问题讨论】:
-
您缺少的最明显的#include 是string.h,因为没有它就不支持strlen。这将至少消除您的一个警告。而且我认为您可能需要创建/销毁 api,而不是新/免费版本。检查您的 API。
-
您使用的是哪个 OpenSSL 版本?我只在 v1.1.0 包含文件中看到了
EVP_MD_CTX_new。 -
@CristiFati 这确实是一个版本问题。我通过从源代码编译解决了它。请参阅下面接受的答案。