Вот настройка:
boost1::asio::io_service _ios;
boost::asio::ip::tcp::acceptor _acceptor;`
...
_acceptor(_ios)
...
boost::system::error_code ec;
int rc = _ios.run(ec);
с gdb Я вижу, что вызов вызова вызова в boost:: asio:: impl:: io_service:: run
Вот немного повышения
повышение/ASIO/осущ/io_service.ipp:
std::size_t io_service::run(boost::system::error_code& ec)
{
return impl_.run(ec);
}
Вот доказательство того, что impl_ является task_io_service для случая linux.
усиление/увеличение/ASIO/io_service.hpp
#if defined(BOOST_ASIO_HAS_IOCP)
namespace detail { typedef win_iocp_io_service io_service_impl; }
#else
namespace detail { typedef task_io_service io_service_impl; }
#endif
...
private:
typedef detail::io_service_impl impl_type;
#if defined(BOOST_ASIO_HAS_IOCP)
friend class detail::win_iocp_overlapped_ptr;
#endif
...
impl_type& impl_;
Если во время компиляции я не связываю -lboost_log, тогда вызов impl_run разрешен (через вызов plt stub, ld_trampoline.S dl-runtime_resolve и dl-runtime.c _dl_fixup) для boost:: asio:: detail:: impl:: task_io_service:: запускается в моем двоичном и run() начинает ждать работы, предоставляемой акцептором.
Если я активирую ссылку, через GDB я вижу, что этот вызов должен быть разрешен для символа libboost_log.so _ZN5boost4asio6detail15task_io_service3runERNS_6system10error_codeE и завершает работу почти сразу.
nm -D libboost_log.so подтверждает, что символ есть, и это не моя проблема связывания.
Почему этот символ task_io_service3run в libboost_log.so? Кажется, что это ошибка увеличения, не так ли? Существуют ли способы обеспечения предполагаемого разрешения метода?