【问题标题】:OpenSSL undefined referencesOpenSSL 未定义的引用
【发布时间】: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 这确实是一个版本问题。我通过从源代码编译解决了它。请参阅下面接受的答案。

标签: c openssl


【解决方案1】:

@约翰!

一个大胆的猜测是您在您的计算机中安装了与您当前的 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 toEVP_MD_CTX_new'`

通知EVP_MD_CTX_new() 不在您的 OpenSSL 库中。

也许您的 OpenSSL 示例比您尝试编译的 OpenSSL 示例文件更新(或更旧)。

假设您的示例比您的库和头文件更新,通常的解决方案是下载源文件并重新编译它们以获得更新的 OpenSSL。

另一种可能性正好相反:您有一个较新的 OpenSSL,而该示例属于较旧的一个。在这种情况下,您必须找到一个更新的示例。

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

祝你好运!

【讨论】:

  • 谢谢,你确实一针见血。我从源代码编译,现在一切都很好。
猜你喜欢
  • 1970-01-01
  • 2012-08-14
  • 2011-08-07
  • 2017-03-31
  • 1970-01-01
  • 2012-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多