Boost.Log在MacOS ARM环境下触发record_ostream.hpp断言失败求助
Boost.Log 在 macOS ARM 环境运行时触发断言错误/类型转换异常
问题详情
编译阶段(CMake + Ninja)无报错,但运行二进制程序时触发Boost.Log断言失败,错误信息如下:
Assertion failed: (m_record != __null), function get_record, file /usr/local/include/boost/log/sources/record_ostream.hpp, line 161.
触发错误的代码行:
BOOST_LOG_TRIVIAL(info) << "Started TCP server";
编写极简测试程序后,错误变为类型转换异常:
#include <boost/log/trivial.hpp> int main() { BOOST_LOG_TRIVIAL(info) << "hello"; }
运行时抛出:
terminate called after throwing an instance of 'std::bad_cast'
what(): std::bad_cast
环境对比
出错环境
- 架构:ARM(MacBookPro M3)
- 操作系统:macOS
- 编译器:g++-11(Homebrew安装)
- Boost版本:1.74
正常运行环境
- 架构:ARM(UTM虚拟化)、x86-64(AWS EC2)
- 操作系统:Debian 12
- 编译器:g++-11
- Boost版本:1.74
版本选择说明
选用g++-11 + Boost 1.74是因为Debian 12中用g++-12编译Boost 1.74存在已知bug。
解决方案
1. 显式初始化Boost.Log核心
macOS下Boost.Log的隐式初始化机制可能失效,需在程序启动时手动初始化日志核心:
#include <boost/log/core.hpp> #include <boost/log/trivial.hpp> #include <boost/log/expressions.hpp> int main() { // 初始化日志过滤规则,确保日志核心正常启动 boost::log::core::get()->set_filter( boost::log::trivial::severity >= boost::log::trivial::info ); BOOST_LOG_TRIVIAL(info) << "Started TCP server"; return 0; }
2. 针对macOS ARM手动编译Boost库
Homebrew提供的Boost可能存在跨架构兼容问题,手动编译适配当前环境:
# 解压Boost 1.74源码 tar xzf boost_1_74_0.tar.gz cd boost_1_74_0 # 配置编译环境,指定gcc-11为工具链 ./bootstrap.sh --with-toolset=gcc-11 # 编译并安装,适配ARM64架构 ./b2 install \ toolset=gcc-11 \ architecture=arm \ address-model=64 \ threading=multi \ variant=release \ --prefix=/usr/local
3. 调整CMake编译与链接配置
在CMakeLists.txt中添加Boost.Log专属宏定义和链接选项:
find_package(Boost 1.74 REQUIRED COMPONENTS log log_setup) add_executable(your_server main.cpp) target_link_libraries(your_server PRIVATE Boost::log Boost::log_setup) # macOS特定配置 if(APPLE) # 启用动态链接Boost.Log target_compile_definitions(your_server PRIVATE BOOST_LOG_DYN_LINK) # 适配macOS动态链接器行为 target_link_options(your_server PRIVATE -undefined dynamic_lookup) endif()
内容的提问来源于stack exchange,提问作者whwh
相关产品推荐
相关产品推荐

