Qt Creator中Abseil日志重复输出的问题求助
解决Qt Creator中Abseil日志重复显示的问题
问题现象
基于Abseil的C++项目在Qt Creator中运行时,Abseil日志会在「Application Output」面板重复显示:一次为红色(对应stderr输出),一次为白色(对应Windows调试输出)。但std::cout/std::cerr输出正常,命令行运行时日志仅输出一次到stderr,符合预期。
环境信息
- 操作系统:Windows 10
- Qt Creator版本:11、12
- Qt版本:6.2.4 MSVC2019 64位
- Abseil版本:提交哈希
2a636651729cec997a433ce8e363c6344130944e(旧版本也存在此问题)
原因分析
Abseil在Windows平台默认初始化时,会添加两个日志接收器:
- 输出到
stderr的标准接收器 - 输出到Windows调试输出(
OutputDebugString)的接收器
Qt Creator的「Application Output」面板会同时捕获这两个渠道的输出,因此导致日志重复显示。命令行运行时,调试输出不会被控制台捕获,所以仅显示一次。
解决方案
方案1:通过编译选项禁用调试输出
在CMakeLists.txt中添加编译定义,直接关闭Abseil的调试输出支持:
cmake_minimum_required(VERSION 3.26.4) project(main LANGUAGES CXX) add_executable(${PROJECT_NAME} main.cpp ) set(ABSL_PROPAGATE_CXX_STD ON) add_subdirectory(abseil-cpp) # 添加编译定义,禁用Abseil调试输出 target_compile_definitions(${PROJECT_NAME} PRIVATE ABSL_NO_DEBUG_OUTPUT) target_link_libraries(${PROJECT_NAME} PUBLIC absl::log absl::log_initialize )
方案2:手动配置日志接收器
禁用Abseil默认初始化逻辑,仅添加输出到stderr的接收器:
#include <absl/log/globals.h> #include <absl/log/initialize.h> #include <absl/log/log.h> #include <absl/log/log_sink.h> #include <absl/log/stderr_log_sink.h> #include <iostream> int main() { // 禁用默认日志初始化 absl::DisableLogInit(); // 仅添加输出到stderr的日志接收器 static absl::StderrLogSink stderr_sink; absl::AddLogSink(&stderr_sink); absl::SetStderrThreshold(absl::LogSeverityAtLeast::kInfo); std::cout << "Cout test" << std::endl; std::cerr << "Cerr test" << std::endl; LOG(INFO) << "test"; // 程序退出前移除接收器(可选,进程结束时会自动清理) absl::RemoveLogSink(&stderr_sink); return 0; }
验证效果
修改后在Qt Creator中运行项目,Abseil日志将仅显示一次(红色,对应stderr输出),与std::cerr的显示行为一致;命令行运行也保持正常单次输出。
内容的提问来源于stack exchange,提问作者Victor Stone
相关产品推荐
相关产品推荐

