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

链接Jolt后std::set_terminate()失效问题排查

std::set_terminate 处理器链接Jolt库后失效的问题解决

问题现象

单独编译运行以下代码时,std::set_terminate 注册的终止处理器能正常触发:

#include <exception>
#include <iostream>
int main(int argc, char* argv[])
{
    std::set_terminate([]() {
        std::cout << "Called terminate handler";
        });
    std::terminate();
}

但在CMake项目中通过以下命令引入并链接Jolt库后,主程序的std::set_terminate处理器不再生效:

add_subdirectory(my_library_directory)
target_link_libraries(my_target PUBLIC Jolt)

问题根源

Jolt库默认未启用CPP_EXCEPTIONS_ENABLED配置项,会自动关闭C++异常支持:

  • MSVC环境下,会移除/EHsc编译标志
  • GCC/Clang环境下,会添加-fno-exceptions编译标志
    由于使用PUBLIC方式链接Jolt,这些禁用异常的编译选项会被传递给主项目,导致C++异常相关机制(包括std::set_terminate)无法正常工作。

解决方案

方法一:全局开启Jolt的异常支持

在添加Jolt子目录前,强制设置CPP_EXCEPTIONS_ENABLED为ON,让Jolt以支持异常的方式编译:

set(CPP_EXCEPTIONS_ENABLED ON CACHE BOOL "Enable C++ exceptions for Jolt" FORCE)
add_subdirectory(my_library_directory)
target_link_libraries(my_target PUBLIC Jolt)

方法二:为主项目目标强制启用异常

直接给主项目的目标添加启用异常的编译标志,覆盖Jolt带来的配置:

  • 针对MSVC编译器:
target_compile_options(my_target PRIVATE /EHsc)
  • 针对GCC/Clang编译器:
target_compile_options(my_target PRIVATE -fexceptions)

内容的提问来源于stack exchange,提问作者Zebrafish

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 02:09:56