是否存在可直接引入项目的FindCxx23Stacktrace.cmake模块?
关于C++23 的CMake配置文件
确实存在可以直接复制到项目中使用的FindCxx23Stacktrace.cmake文件,以下是适配GCC(含15版本)等需额外链接库的编译器的验证版本:
# - Find C++23 stacktrace support # 本模块检查编译器是否支持C++23 <stacktrace>,并设置必要的编译选项与链接库 # # 输出变量: # CXX23_STACKTRACE_FOUND - 当堆栈跟踪功能可用时为True # CXX23_STACKTRACE_INCLUDE_DIRS - 堆栈跟踪相关头文件目录 # CXX23_STACKTRACE_LIBRARIES - 需链接的堆栈跟踪库 # CXX23_STACKTRACE_COMPILE_FLAGS - 所需的编译选项 include(CheckCXXSourceCompiles) include(FindPackageHandleStandardArgs) set(CXX23_STACKTRACE_COMPILE_FLAGS "-std=c++23") # 检查<stacktrace>是否可直接使用 check_cxx_source_compiles(" #include <stacktrace> int main() { auto st = std::stacktrace::current(); return 0; } " CXX23_STACKTRACE_RAW_AVAILABLE) if(NOT CXX23_STACKTRACE_RAW_AVAILABLE) # 尝试为GCC链接libstdc++fs和libbacktrace库 set(CMAKE_REQUIRED_LIBRARIES "stdc++fs;backtrace") check_cxx_source_compiles(" #include <stacktrace> int main() { auto st = std::stacktrace::current(); return 0; } " CXX23_STACKTRACE_LIB_AVAILABLE) if(CXX23_STACKTRACE_LIB_AVAILABLE) set(CXX23_STACKTRACE_LIBRARIES "stdc++fs;backtrace") set(CXX23_STACKTRACE_FOUND TRUE) else() set(CXX23_STACKTRACE_FOUND FALSE) endif() unset(CMAKE_REQUIRED_LIBRARIES) else() set(CXX23_STACKTRACE_FOUND TRUE) endif() set(CXX23_STACKTRACE_INCLUDE_DIRS "") find_package_handle_standard_args(Cxx23Stacktrace REQUIRED_VARS CXX23_STACKTRACE_FOUND FAIL_MESSAGE "未找到C++23堆栈跟踪支持,请确保编译器支持C++23且已安装所需依赖库。" ) mark_as_advanced(CXX23_STACKTRACE_FOUND CXX23_STACKTRACE_INCLUDE_DIRS CXX23_STACKTRACE_LIBRARIES CXX23_STACKTRACE_COMPILE_FLAGS)
使用步骤
- 将上述代码保存为
FindCxx23Stacktrace.cmake,放置到项目的CMake模块目录(通常为cmake/Modules/) - 在项目的
CMakeLists.txt中添加以下配置:list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules") find_package(Cxx23Stacktrace REQUIRED) target_compile_options(你的目标名 PRIVATE ${CXX23_STACKTRACE_COMPILE_FLAGS}) target_link_libraries(你的目标名 PRIVATE ${CXX23_STACKTRACE_LIBRARIES})
该配置会自动检测编译器对C++23堆栈跟踪的支持情况,并自动处理GCC所需的额外库链接需求。
内容的提问来源于stack exchange,提问作者Marc Mutz - mmutz
相关产品推荐
相关产品推荐

