ASIO 1.24关闭RTTI编译出现未定义引用错误,求解决方法
解决ASIO 1.24无RTTI编译时的未定义引用错误
当使用ASIO_NO_EXCEPTIONS和ASIO_NO_TYPEID编译ASIO 1.24代码时,出现的未定义引用错误是因为ASIO禁用异常后,要求用户提供自定义的异常处理函数实现。以下是具体解决步骤:
1. 实现自定义的asio::detail::throw_exception函数
ASIO在禁用异常时不会提供默认的异常抛出逻辑,你必须自己实现asio::detail::throw_exception模板函数,以满足链接器的符号需求。通常可以让该函数直接终止程序,示例修改后的代码:
#define ASIO_STANDALONE #define ASIO_HEADER_ONLY #define ASIO_NO_EXCEPTIONS #define ASIO_NO_TYPEID #include "asio.hpp" namespace asio::detail { template <typename Exception> void throw_exception(const Exception&) { // 禁用异常时直接终止程序,可根据需求替换为日志等处理逻辑 std::abort(); } } // namespace asio::detail int main() { asio::io_context io; return 0; }
2. 确认编译参数
你的编译命令已经正确包含了-fno-rtti和-fno-exceptions,配合代码中的宏定义:
ASIO_STANDALONE:使用独立版ASIO,不依赖BoostASIO_HEADER_ONLY:以头文件模式编译,无需链接ASIO库ASIO_NO_EXCEPTIONS:关闭ASIO的异常支持ASIO_NO_TYPEID:禁用RTTI,和编译参数-fno-rtti对应
错误原因说明
当启用ASIO_NO_EXCEPTIONS时,ASIO内部的错误检查路径仍然会调用throw_exception函数,但不会提供默认实现。链接器找不到该函数的定义,因此报出未定义引用错误。实现自定义的throw_exception后,链接器就能找到对应的符号,编译即可成功。
内容的提问来源于stack exchange,提问作者user3564880
相关产品推荐
相关产品推荐

