boost / asio / ssl выдает неопределенную эталонную ошибку

Я новичок в 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;
}

Я гуглил и гуглил, и несколько подсказок, которые мне удалось найти, подсказывают, что я использую некоторые флаги библиотеки ускорения. Итак, я сделал: 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 '

or:

неопределенная ссылка на `ERR_reason_error_string '.

Еще один забавный факт заключается в том, что если я изменю include:

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

например, чтобы

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

он компилируется отлично (даже без -lboost_system и всех остальных ..).

Я потратил на это целый день и до сих пор не могу понять этого. Есть идеи, ребята?


person Michael    schedule 03.02.2014    source источник
comment
add: -lcrypto -lssl - ваш буст основан на зависимости от этих библиотек   -  person Petesh    schedule 03.02.2014
comment
Спасибо, человек, который действительно скомпилировал код выше, но у меня есть старый код, написанный с помощью libboost1.42, и его make-файл содержит (среди прочего) флаг -lcrypt (вместо crypto). Если я изменю его на криптовалюту, он компилируется, но не работает. Можете ли вы объяснить разницу между криптой и криптовалютой, и что я могу сделать в моей ситуации? Большое спасибо!   -  person Michael    schedule 04.02.2014
comment
@Petesh это не Boost, созданный с зависимостью OpenSSL, а пользовательская программа. @Michael, libcrypt является частью GLIBC, а libcrypto является частью OpenSSL. Если в вашем старом коде используются Boost.Asio части, зависящие от libcrypto, вам следует установить с ним ссылку. Но, может быть, вы попытаетесь скомпилировать более новую версию Boost.Asio, в то время как ваш код действительно ожидает более старую?   -  person Igor R.    schedule 04.02.2014


Ответы (1)


В vs2013, когда я включаю ‹boost / asio / ssl.hpp›, я вижу неразрешенный внешний символ _CONF_modules_upload неразрешенный внешний символ _ERR_reason_error_string Я решил эти проблемы, добавив libcrypto32MD.lib в Linker / Additional Dependencies

person Leo    schedule 03.09.2020