Я пытаюсь использовать ASIO (1.24) без rtti, но всегда получаю неопределенные ссылки. Поэтому я сделал простую тестовую программу, которая воспроизводит проблему:
Основной.cpp:
#define ASIO_STANDALONE
#define ASIO_HEADER_ONLY
#define ASIO_NO_EXCEPTIONS
#define ASIO_NO_TYPEID
#include "asio.hpp"
int main()
{
asio::io_context io;
return 0;
}
Когда он компилируется с
g++-12 -o Test -std=c++20 -fno-rtti -fno-exceptions -I../libs/Asio/1.24.0/include Main.cpp
я получил
undefined reference to `void asio::detail::throw_exception<std::system_error>(std::system_error const&)'
undefined reference to `void asio::detail::throw_exception<asio::invalid_service_owner>(asio::invalid_service_owner const&)'
undefined reference to `void asio::detail::throw_exception<asio::service_already_exists>(asio::service_already_exists const&)'
Я что-то пропустил? Как я могу заставить это скомпилировать?





В документации Boost указано, что вам необходимо предоставить функцию throw_exception, если вы компилируете без поддержки исключений:
Этот макрос отключает обработку исключений в Boost, перенаправляя все исключения в определяемую пользователем версию
boost::throw_exceptionбез шаблона. Однако, еслиBOOST_EXCEPTION_DISABLEтакже не определен, пользователи по-прежнему могут проверять объект исключения на наличие любых данных, добавленных в момент броска, или использоватьboost::diagnostic_information(конечно, вBOOST_NO_EXCEPTIONSопределяемый пользователемboost::throw_exceptionне может возвращаться к вызывающей стороне.)
Я предполагаю, что это близко переводит на автономный Asio