我是OpenSSL的新手,我正在尝试编译我在他们的文档中找到的this example。逐字的例子如下:
_source
然后我尝试编译:
#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
的变体。感谢。
答案 0 :(得分:2)
@john!
一个疯狂的猜测是,您已在计算机中安装了一个OpenSSL库版本,并包含与您当前的OpenSSL库和包含文件不兼容的文件。
警告
example.c:25:7: warning: assignment makes pointer from integer without a cast [enabled by default]
表示在头文件中找不到EVP_MD_CTX_new()
,并且它被认为是一个返回整数的函数,这是C中的默认行为。
错误example.c:(.text+0xc4): undefined reference to
EVP_MD_CTX_new&#39;`
通知EVP_MD_CTX_new()
不在您的OpenSSL库中。
也许您的OpenSSL示例比您尝试编译的OpenSSL示例文件更新(或更旧)。
假设您的示例比库和头文件更新,通常的解决方案是下载源文件并重新编译它们以获得更新的OpenSSL。
另一种可能性恰恰相反:您有一个较新的OpenSSL,该示例属于较旧的OpenSSL。在这种情况下,你必须找到一个更新的例子。
因此,您必须检查所涉及的所有文件的版本。
祝你好运!