簡體   English   中英

無法在關閉異常的情況下編譯獨立的 asio

[英]cannot compile standalone asio with exceptions turned off

我正在嘗試構建使用獨立 asio 作為依賴項的項目。 問題是在異常關閉( -fno-exceptions )的情況下,我必須定義throw_exception function(指向boost 文檔的鏈接),但無論我如何定義 function,linker 都會拋出undefined reference 這就是我試圖定義throw_exception的方式:

#define ASIO_NO_EXCEPTIONS
#include <asio/detail/throw_exception.hpp>

template <class E> 
void asio::detail::throw_exception(E const& e) {
// do something
}

我收到這些鏈接錯誤:

/usr/bin/ld: libsioclient.a(sio_socket.cpp.o): in function `asio::detail::do_throw_error(std::error_code const&, char const*) [clone .isra.0]':
sio_socket.cpp:(.text+0x333): undefined reference to `void asio::detail::throw_exception<std::system_error>(std::system_error const&)'
/usr/bin/ld: _libsioclient.a(sio_socket.cpp.o): in function `void asio::execution::detail::any_executor_base::query_fn<void, asio::execution::prefer_only<asio::execution::detail::outstanding_work::tracked_t<0> > >(void*, void const*, void const*)':
sio_socket.cpp:(.text._ZN4asio9execution6detail17any_executor_base8query_fnIvNS0_11prefer_onlyINS1_16outstanding_work9tracked_tILi0EEEEEEEvPvPKvSB_[_ZN4asio9execution6detail17any_executor_base8query_fnIvNS0_11prefer_onlyINS1_16outstanding_work9tracked_tILi0EEEEEEEvPvPKvSB_]+0x28): undefined reference to `void asio::detail::throw_exception<asio::execution::bad_executor>(asio::execution::bad_executor const&)'
/usr/bin/ld: libsioclient.a(sio_socket.cpp.o): in function `void asio::execution::detail::any_executor_base::query_fn<void, asio::execution::prefer_only<asio::execution::detail::outstanding_work::untracked_t<0> > >(void*, void const*, void const*)':
sio_socket.cpp:(.text._ZN4asio9execution6detail17any_executor_base8query_fnIvNS0_11prefer_onlyINS1_16outstanding_work11untracked_tILi0EEEEEEEvPvPKvSB_[_ZN4asio9execution6detail17any_executor_base8query_fnIvNS0_11prefer_onlyINS1_16outstanding_work11untracked_tILi0EEEEEEEvPvPKvSB_]+0x28): undefined reference to `void asio::detail::throw_exception<asio::execution::bad_executor>(asio::execution::bad_executor const&)'
/usr/bin/ld: libsioclient.a(sio_socket.cpp.o): in function `void asio::execution::detail::any_executor_base::query_fn<void, asio::execution::prefer_only<asio::execution::detail::relationship::fork_t<0> > >(void*, void const*, void const*)':
sio_socket.cpp:(.text._ZN4asio9execution6detail17any_executor_base8query_fnIvNS0_11prefer_onlyINS1_12relationship6fork_tILi0EEEEEEEvPvPKvSB_[_ZN4asio9execution6detail17any_executor_base8query_fnIvNS0_11prefer_onlyINS1_12relationship6fork_tILi0EEEEEEEvPvPKvSB_]+0x28): undefined reference to `void asio::detail::throw_exception<asio::execution::bad_executor>(asio::execution::bad_executor const&)'
/usr/bin/ld: libsioclient.a(sio_socket.cpp.o): in function `void asio::execution::detail::any_executor_base::query_fn<void, asio::execution::prefer_only<asio::execution::detail::relationship::continuation_t<0> > >(void*, void const*, void const*)':
sio_socket.cpp:(.text._ZN4asio9execution6detail17any_executor_base8query_fnIvNS0_11prefer_onlyINS1_12relationship14continuation_tILi0EEEEEEEvPvPKvSB_[_ZN4asio9execution6detail17any_executor_base8query_fnIvNS0_11prefer_onlyINS1_12relationship14continuation_tILi0EEEEEEEvPvPKvSB_]+0x28): undefined reference to `void asio::detail::throw_exception<asio::execution::bad_executor>(asio::execution::bad_executor const&)'
/usr/bin/ld: libsioclient.a(sio_socket.cpp.o): in function `void asio::execution::detail::any_executor_base::query_fn<void, asio::execution::context_as_t<asio::execution_context&> >(void*, void const*, void const*)':
sio_socket.cpp:(.text._ZN4asio9execution6detail17any_executor_base8query_fnIvNS0_12context_as_tIRNS_17execution_contextEEEEEvPvPKvSA_[_ZN4asio9execution6detail17any_executor_base8query_fnIvNS0_12context_as_tIRNS_17execution_contextEEEEEvPvPKvSA_]+0x28): undefined reference to `void asio::detail::throw_exception<asio::execution::bad_executor>(asio::execution::bad_executor const&)'
/usr/bin/ld: libsioclient.a(sio_socket.cpp.o):sio_socket.cpp:(.text._ZN4asio9execution6detail17any_executor_base10require_fnINS0_12any_executorIJNS0_12context_as_tIRNS_17execution_contextEEENS1_8blocking7never_tILi0EEENS0_11prefer_onlyINS9_10possibly_tILi0EEEEENSC_INS1_16outstanding_work9tracked_tILi0EEEEENSC_INSG_11untracked_tILi0EEEEENSC_INS1_12relationship6fork_tILi0EEEEENSC_INSN_14continuation_tILi0EEEEEEEEvS8_EET_PKvSX_[_ZN4asio9execution6detail17any_executor_base10require_fnINS0_12any_executorIJNS0_12context_as_tIRNS_17execution_contextEEENS1_8blocking7never_tILi0EEENS0_11prefer_onlyINS9_10possibly_tILi0EEEEENSC_INS1_16outstanding_work9tracked_tILi0EEEEENSC_INSG_11untracked_tILi0EEEEENSC_INS1_12relationship6fork_tILi0EEEEENSC_INSN_14continuation_tILi0EEEEEEEEvS8_EET_PKvSX_]+0x2d): more undefined references to `void asio::detail::throw_exception<asio::execution::bad_executor>(asio::execution::bad_executor const&)' follow
/usr/bin/ld: libsioclient.a(sio_socket.cpp.o): in function `asio::detail::scheduler::scheduler(asio::execution_context&, int, bool, asio::detail::scheduler_task* (*)(asio::execution_context&)) [clone .part.0]':
sio_socket.cpp:(.text._ZN4asio6detail9schedulerC2ERNS_17execution_contextEibPFPNS0_14scheduler_taskES3_E.part.0[_ZN4asio6detail9schedulerC5ERNS_17execution_contextEibPFPNS0_14scheduler_taskES3_E]+0x228): undefined reference to `void asio::detail::throw_exception<std::system_error>(std::system_error const&)'
/usr/bin/ld: libsioclient.a(sio_socket.cpp.o): in function `asio::detail::epoll_reactor::notify_fork(asio::execution_context::fork_event)':
sio_socket.cpp:(.text._ZN4asio6detail13epoll_reactor11notify_forkENS_17execution_context10fork_eventE[_ZN4asio6detail13epoll_reactor11notify_forkENS_17execution_context10fork_eventE]+0x375): undefined reference to `void asio::detail::throw_exception<std::system_error>(std::system_error const&)'
/usr/bin/ld: libsioclient.a(sio_socket.cpp.o): in function `asio::detail::scheduler::scheduler(asio::execution_context&, int, bool, asio::detail::scheduler_task* (*)(asio::execution_context&))':
sio_socket.cpp:(.text._ZN4asio6detail9schedulerC2ERNS_17execution_contextEibPFPNS0_14scheduler_taskES3_E[_ZN4asio6detail9schedulerC5ERNS_17execution_contextEibPFPNS0_14scheduler_taskES3_E]+0x24a): undefined reference to `void asio::detail::throw_exception<std::system_error>(std::system_error const&)'
/usr/bin/ld: sio_socket.cpp:(.text._ZN4asio6detail9schedulerC2ERNS_17execution_contextEibPFPNS0_14scheduler_taskES3_E[_ZN4asio6detail9schedulerC5ERNS_17execution_contextEibPFPNS0_14scheduler_taskES3_E]+0x4f7): undefined reference to `void asio::detail::throw_exception<std::system_error>(std::system_error const&)'
/usr/bin/ld: libsioclient.a(sio_socket.cpp.o): in function `asio::execution_context::service* asio::detail::service_registry::create<asio::detail::epoll_reactor, asio::execution_context>(void*)':
sio_socket.cpp:(.text._ZN4asio6detail16service_registry6createINS0_13epoll_reactorENS_17execution_contextEEEPNS4_7serviceEPv[_ZN4asio6detail16service_registry6createINS0_13epoll_reactorENS_17execution_contextEEEPNS4_7serviceEPv]+0x5d6): undefined reference to `void asio::detail::throw_exception<std::system_error>(std::system_error const&)'
/usr/bin/ld: libsioclient.a(sio_client_impl.cpp.o): in function `std::_Function_handler<void (bool, std::shared_ptr<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const> const&), sio::client_impl::on_ping()::{lambda(bool, std::shared_ptr<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const>)#1}>::_M_invoke(std::_Any_data const&, bool&&, std::shared_ptr<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const> const&)':
sio_client_impl.cpp:(.text+0x3c40): undefined reference to `websocketpp::endpoint<websocketpp::connection<websocketpp::config::asio_client>, websocketpp::config::asio_client>::send(std::weak_ptr<void>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, websocketpp::frame::opcode::value)'
/usr/bin/ld: libsioclient.a(sio_client_impl.cpp.o): in function `sio::client_impl::connect_impl(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
sio_client_impl.cpp:(.text+0x988c): undefined reference to `websocketpp::connection<websocketpp::config::asio_client>::replace_header(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'

如何正確定義throw_exception function 或者如果我遺漏了什么,如何解決這些錯誤?

你可以試試這個, log() 是你已經用於日志記錄虛構的 function ...

// somechere in a cpp file, preferably.

#include <boost/asio.hpp>

// ...

namespace boost::asio::detail {

template<>
void throw_exception(const asio::execution::bad_executor& e)
{
    // throw e;  // this is what the original function does
    LOG("asio::execution::bad_executor thrown\n");   // etc...
    exit(3);     // That's all you can do at this point.
}

template<>
void throw_exception(const std::system_error& e)
{
    LOG("std::system_error thrown\n");  // etc...
    exit(3);     // That's all you can do at this point.
}

}

go 時,您可能需要申報更多專業。

我找到解決方案。 問題是編譯器在編譯時從代碼中拋出了throw_exception的實現,當 linker 試圖找到 function 時,根本就沒有throw_exception 我是這樣的:

namespace asio::detail {

    template <typename Exception> void throw_exception(const Exception& e) {
        std::cerr << "Something went wrong..." << std::endl;
        std::terminate();
    }
}; // namespace asio::detail

如果我在某處調用此 function,我不會收到鏈接錯誤。 可能,我必須實施某種錯誤處理而不是那樣,並找到一個解決方案來正確編譯和鏈接這個 function,但是,至少,我找到了這種奇怪行為的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM