OpenSSL未定义的引用

时间:2017-03-27 16:01:08

标签: c openssl

我是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 的变体。感谢。

1 个答案:

答案 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。在这种情况下,你必须找到一个更新的例子。

因此,您必须检查所涉及的所有文件的版本。

祝你好运!