【问题标题】:Undefined reference to SSL_library_init and SSL_load_error_strings对 SSL_library_init 和 SSL_load_error_strings 的未定义引用
【发布时间】:2011-08-01 09:15:56
【问题描述】:

我正在实现一个 OpenSSL 代码,并且已经包含了所需的头文件,但我仍然收到 *

之类的错误

SSL_library_init的未定义引用

我猜这是链接错误而不是编译错误。

我正在使用 slickeditor 在 Linux 机器中实现它。

【问题讨论】:

  • 你是如何调用链接器的?您是否指示它链接到 OpenSSL 库,例如使用 -lcrypto 用于 gcc?
  • 不。我得到的机器已经有openssl。当我执行 which openssl 时,它显示的路径类似于 /usr/bin/openssl。所以我做的下一步是在我现有的代码中包含头文件,然后在 slickeditor 属性中我尝试包含 -llibeay32 和 -lssleay32。但没有快乐
  • OpenSSL 库称为 libcrypto。使用 -lcrypto 链接到它。我对 SlickEdit 一无所知。它是在为您调用编译器和链接器,是在 makefile 中完成的,还是在命令行中完成的?您需要以某种方式告诉链接器链接到 libcrypto。对于在命令行上调用 gcc,这意味着添加选项 -lcrypto
  • 抱歉,SSL_library_init 在 libssl 中,因此链接选项将是 -lsslldd $(which openssl) 将向您展示您的 openssl 是如何链接的以及这些库在哪里。如果它仍然不起作用,则该目录可能不在链接器的路径上。您可以使用-Lpath 添加该路径,例如-L/lib/
  • 你应该得到一个在命令行上工作的最小测试用例。 #include "whatever" \n int main(void) { SSL_library_init(blah, blah, blah); return 0; },然后是 g++ my_minimal_test_case.c++ -lssl。如果这可行,那么您不了解您的编辑器/IDE。如果没有,那么您有一些配置问题。

标签: c openssl undefined-reference


【解决方案1】:

链接到libssllibcrypto。您的 LDFLAGSLDLIBS 如下所示。 LDLIBS的订单事宜:

LDFLAGS = -L/usr/local/ssl/lib
LDLIBS = -lssl -lcrypto

不必担心在库名称前添加“lib”,或者在“so”或“a”后缀。链接器会为您完成。

如果您是从命令行构建,那么您将使用以下内容。同样,订单很重要。

gcc foo.c -o foo.exe -L/usr/local/ssl/lib -lssl -lcrypto

如果您使用的是系统的OpenSSL,那么您可以省略-L/usr/local/ssl/lib

【讨论】:

  • 根据cmets的问题,SSL_library_init在libssl中,那么正确的顺序不应该是LDLIBS = -lcrypto -lssl吗?
  • @CraigScott - 抱歉回复晚了。顺序很重要,因为它是一个单通道链接器。当 LD 遇到不满意的链接符号时,它会记录它们并在随后的库中查找它们。如果libcrypto 是第一个,那么libssl 将有像BN_new 这样的不满足符号,因为libcrypto 需要跟随libssl 来满足缺失的符号。另一种选择是两遍链接器。有时您还会看到类似-la -lb -laliba 后跟libb 后跟liba)。这通常是由于隐藏在幕后的循环引用。
  • “订单很重要”对我来说是关键。谢谢。
【解决方案2】:

对我来说这意味着安装

 apt install libssl1.0-dev

【讨论】:

  • 你是救生员。试图在 Ubuntu 18 上编译 AOSP,不得不降级 openssl 1.1 -> 1.0.1 ,但安装了 libssl-dev
  • 给你们两个高五。我遇到了同样的问题,这两个 cmet 的组合让我意识到了这一点。
【解决方案3】:

这些方法在 OpenSSL 1.1 中已弃用。你不需要更多地使用它。你可以删除它。 OpenSSL 手册中的更多信息。

【讨论】:

    【解决方案4】:

    ldd libssl.so -> libcrypto.so.1.1 => 未找到

    sudo ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1

    libcrypto.so.1.1 => /lib64/libcrypto.so.1.1 (0x00007f17d46c7000)

    【讨论】:

      猜你喜欢
      • 2012-05-12
      • 2018-06-17
      • 2016-02-23
      • 2012-01-30
      • 2015-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多