链接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
相关产品推荐
相关产品推荐

