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

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平台默认初始化时,会添加两个日志接收器:

  1. 输出到stderr的标准接收器
  2. 输出到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 23:46:31