boost/asio/ssl 抛出“未定义的引用”错误

Posted

技术标签:

【中文标题】boost/asio/ssl 抛出“未定义的引用”错误【英文标题】:boost/asio/ssl throwing "undefined reference" error 【发布时间】:2014-02-27 04:24:38 【问题描述】:

我是 boost 新手,正在尝试编译包含 boost/asio/ssl 的最基本程序。 我正在开发 ubuntu 13.10 64bit 并安装了最新的 boost:

sudo apt-get install boost-all-dev

这是我正在尝试编译的精彩代码:

#include <stdio.h>
#include <boost/asio/ssl/stream.hpp>

int main()
   printf("Hi\n");
   return 0;

我用谷歌搜索和搜索,我能找到的一些提示表明我使用了一些 boost 库标志。所以我做了: g++ my_prog.cpp -o my_prog.bin -lboost_system -lboost_thread -lpthread

而且我总是收到相同的错误消息(无论我推了多少 -l):

/tmp/cci6dJdZ.o: In function `boost::asio::ssl::detail::openssl_init_base::do_init::do_init()':
my_prog.cpp:(.text._ZN5boost4asio3ssl6detail17openssl_init_base7do_initC2Ev[_ZN5boost4asio3ssl6detail17openssl_init_base7do_initC5Ev]+0x2c): undefined reference to `SSL_library_init'
my_prog.cpp:(.text._ZN5boost4asio3ssl6detail17openssl_init_base7do_initC2Ev[_ZN5boost4asio3ssl6detail17openssl_init_base7do_initC5Ev]+0x31): undefined reference to `SSL_load_error_strings'
my_prog.cpp:(.text._ZN5boost4asio3ssl6detail17openssl_init_base7do_initC2Ev[_ZN5boost4asio3ssl6detail17openssl_init_base7do_initC5Ev]+0x36): undefined reference to `OPENSSL_add_all_algorithms_noconf'
my_prog.cpp:(.text._ZN5boost4asio3ssl6detail17openssl_init_base7do_initC2Ev[_ZN5boost4asio3ssl6detail17openssl_init_base7do_initC5Ev]+0x47): undefined reference to `CRYPTO_num_locks'
my_prog.cpp:(.text._ZN5boost4asio3ssl6detail17openssl_init_base7do_initC2Ev[_ZN5boost4asio3ssl6detail17openssl_init_base7do_initC5Ev]+0xcc): undefined reference to `CRYPTO_set_locking_callback'
my_prog.cpp:(.text._ZN5boost4asio3ssl6detail17openssl_init_base7do_initC2Ev[_ZN5boost4asio3ssl6detail17openssl_init_base7do_initC5Ev]+0xd6): undefined reference to `CRYPTO_set_id_callback'
/tmp/cci6dJdZ.o: In function `boost::asio::ssl::detail::openssl_init_base::do_init::~do_init()':
my_prog.cpp:(.text._ZN5boost4asio3ssl6detail17openssl_init_base7do_initD2Ev[_ZN5boost4asio3ssl6detail17openssl_init_base7do_initD5Ev]+0x13): undefined reference to `CRYPTO_set_id_callback'
my_prog.cpp:(.text._ZN5boost4asio3ssl6detail17openssl_init_base7do_initD2Ev[_ZN5boost4asio3ssl6detail17openssl_init_base7do_initD5Ev]+0x1d): undefined reference to `CRYPTO_set_locking_callback'
my_prog.cpp:(.text._ZN5boost4asio3ssl6detail17openssl_init_base7do_initD2Ev[_ZN5boost4asio3ssl6detail17openssl_init_base7do_initD5Ev]+0x22): undefined reference to `ERR_free_strings'
my_prog.cpp:(.text._ZN5boost4asio3ssl6detail17openssl_init_base7do_initD2Ev[_ZN5boost4asio3ssl6detail17openssl_init_base7do_initD5Ev]+0x2c): undefined reference to `ERR_remove_state'
my_prog.cpp:(.text._ZN5boost4asio3ssl6detail17openssl_init_base7do_initD2Ev[_ZN5boost4asio3ssl6detail17openssl_init_base7do_initD5Ev]+0x31): undefined reference to `EVP_cleanup'
my_prog.cpp:(.text._ZN5boost4asio3ssl6detail17openssl_init_base7do_initD2Ev[_ZN5boost4asio3ssl6detail17openssl_init_base7do_initD5Ev]+0x36): undefined reference to `CRYPTO_cleanup_all_ex_data'
my_prog.cpp:(.text._ZN5boost4asio3ssl6detail17openssl_init_base7do_initD2Ev[_ZN5boost4asio3ssl6detail17openssl_init_base7do_initD5Ev]+0x40): undefined reference to `CONF_modules_unload'
my_prog.cpp:(.text._ZN5boost4asio3ssl6detail17openssl_init_base7do_initD2Ev[_ZN5boost4asio3ssl6detail17openssl_init_base7do_initD5Ev]+0x45): undefined reference to `ENGINE_cleanup'
/tmp/cci6dJdZ.o: In function `boost::asio::error::detail::ssl_category::message(int) const':
my_prog.cpp:(.text._ZNK5boost4asio5error6detail12ssl_category7messageEi[_ZNK5boost4asio5error6detail12ssl_category7messageEi]+0x1d): undefined reference to `ERR_reason_error_string'
collect2: error: ld returned 1 exit status

或者简而言之:它抱怨缺少符号,例如:

对 `SSL_library_init' 的未定义引用

或:

对“ERR_reason_error_string”的未定义引用。

另一个有趣的事实是,如果我更改包含:

#include <boost/asio/ssl/stream.hpp>

例如

#include <boost/asio/ssl/stream_base.hpp>

它编译得很好(即使没有 -lboost_system 和所有其他......)。

我花了一整天的时间来解决这个问题,但我终其一生都无法弄清楚。 有什么想法吗?

【问题讨论】:

add: -lcrypto -lssl - 你的 boost 依赖于这些库 谢谢,上面的代码确实编译了,但是我有一个用 libboost1.42 编写的旧代码,它的 make 文件包含(除其他外)标志 -lcrypt(而不是加密)。如果我将其更改为加密,它会编译但不起作用。你能解释一下crypt和crypto之间的区别吗?在我的情况下我能做什么?非常感谢! @Petesh 不是使用 OpenSSL 依赖构建的 Boost,而是用户程序。 @Michael,libcrypt 是 GLIBC 的一部分,而 libcrypto 是 OpenSSL 的一部分。如果您的旧代码使用依赖于libcryptoBoost.Asio 部分,您应该链接它。但也许您尝试使用较新的 Boost.Asio 版本进行编译,而您的代码实际上需要一个较旧的版本? 【参考方案1】:

在 vs2013 中,当我包含 时,我看到了 未解析的外部符号 _CONF_modules_upload 未解析的外部符号 _ERR_reason_error_string 我通过添加解决了这些问题 libcrypto32MD.lib 在链接器/附加依赖项中

【讨论】:

以上是关于boost/asio/ssl 抛出“未定义的引用”错误的主要内容,如果未能解决你的问题,请参考以下文章

boost::asio::ssl::context 可以在多个 SSL 流之间共享吗?

如何接受boost :: asio :: ssl :: stream 作为boost :: asio :: ip :: tcp :: socket类型的参数

boost asio ssl async_shutdown 总是以错误结束?

多线程应用程序上的 boost::asio::ssl 访问冲突

为啥 Boost.Asio SSL 请求返​​回 405 Not Allowed?

如何优雅地关闭 boost asio ssl 客户端?