You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 15:33:55