c++日志库使用方法 c++如何集成spdlog或glog

大强大大_9812

大强大大_9812

2026-03-24

213人浏览

原创

spdlog需用header-only模式或正确链接预编译库,避免undefined reference;glog必须首行调用google::InitGoogleLogging,否则静默失效。

c++日志库使用方法 c++如何集成spdlog或glog

spdlog 在 C++ 项目里怎么快速跑起来

直接用 spdlog,不用自己写日志封装,但得避开几个典型编译和链接雷区。它默认不带源码编译,推荐用 header-only 模式或预编译库,否则容易卡在 undefined reference to spdlog::xxx。

常见错误现象:error: 'spdlog' has not been declared 或链接时报一堆 spdlog::logger::log 未定义。

  • 确认头文件路径已加到 CMAKE_INCLUDE_DIRECTORIES 或编译器 -I 参数(比如 spdlog/include)
  • 如果用预编译版本(如 Ubuntu 的 libspdlog-dev),必须链接 -lspdlog,且顺序放在你自己的目标之后
  • header-only 模式更省事:下载 include/spdlog 整个目录,#define SPDLOG_COMPILED_LIB 不要定义,直接 #include
  • Windows 下用 MSVC + vcpkg 安装的,注意是否启用了 SPDLOG_FMT_EXTERNAL —— 若项目也用了 fmt 库,版本不一致会触发 multiple definition of fmt::v8::...

glog 初始化失败、日志不输出的硬伤点

glog 看似简单,但不调 google::InitGoogleLogging 就完全静默,连 FATAL 都不打;而且默认只写文件,stderr 要手动开。

使用场景:适合需要结构化日志路径、严重等级过滤、或已有 Google 生态(如 protobuf)的项目。

  • 必须在 main() 开头第一件事调用 google::InitGoogleLogging(argv[0]),漏掉就等于没启用
  • 想让 INFO 级别也输出到终端?得加 FLAGS_stderrthreshold = google::GLOG_INFO(注意是 FLAGS_ 前缀)
  • 日志文件默认存在 /tmp/(Linux)或当前目录(Windows),路径由 FLAGS_log_dir 控制;若该目录不可写,日志直接丢弃,无提示
  • 多线程下安全,但 google::ShutdownGoogleLogging() 不是必须调用——进程退出时自动清理,强行调可能引发 double-free

spdlog 和 glog 日志级别、格式、性能差异在哪

不是“哪个更好”,而是“哪条路更少返工”。spdlog 默认支持异步、多 sink、运行时重配置;glog 更重稳定性、等级语义严格(INFO/WARNING/ERROR/FATAL),但格式定制弱。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

参数差异与性能影响:

  • spdlog::basic_logger_mt("name", "file.log") 是同步写入;换成 spdlog::basic_logger_st 可减小锁开销,但多线程下需自行保证线程安全
  • glog 的 LOG(INFO) 是宏展开,无函数调用开销,但字符串拼接总执行 —— 即便日志被级别过滤掉,operator 仍会构造临时对象
  • spdlog 支持 spdlog::set_level() 运行时调整,glog 的 FLAGS_minloglevel 只在初始化时读取一次
  • 高频打日志(如每毫秒一次)时,spdlog 异步模式(spdlog::thread_pool)可压测出 3–5 倍吞吐提升;glog 没原生异步,得自己套线程队列

CMake 中正确链接 spdlog/glog 的写法

写错 target_link_libraries 顺序或 scope,是日志库集成失败最隐蔽的原因之一。CMake 不报错,但链接器沉默失败。

关键点:依赖关系必须显式声明,不能靠“看起来好像能连上”。

  • 用 find_package(spdlog REQUIRED) 后,必须 target_link_libraries(your_target PRIVATE spdlog::spdlog)(注意双冒号);写成 spdlog 或 libspdlog 会链接失败
  • glog 用 find_package(glog REQUIRED) 后,链接项是 glog::glog(CMake 3.14+),老版本需用 glog 并手动加 include_directories(${GLOG_INCLUDE_DIRS})
  • 如果你的 target 是 INTERFACE 库,别直接 link 日志库——下游可能不需要,改用 target_compile_definitions + target_include_directories 暴露头文件即可
  • 静态链接 glog 时,确保 libglog.a 编译时没开 -fPIC(否则链接 shared library 会报 relocation R_X86_64_32 against ... cannot be used when making a shared object)

事情说清了就结束。真正麻烦的从来不是“怎么加一行日志”,而是当 core dump 出现在生产环境、而日志既没落盘也没进 stderr 的时候——那会儿再翻 FLAGS_log_dir 权限或 spdlog::flush_on 设置,就晚了。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
typedef和define区别
typedef和define区别

typedef和define区别在类型检查、作用范围、可读性、错误处理和内存占用等。本专题为大家提供typedef和define相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.26

313

5

define的用法
define的用法

define用法:1、定义常量;2、定义函数宏:3、定义条件编译;4、定义多行宏。更多关于define的用法的内容,大家可以阅读本专题下的文章。

2023.10.11

619

5

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.18

1069

5

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.25

3520

5

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

2025.08.29

4708

10

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

2025.10.23

904

4

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

7007

5

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.10

2868

6

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

2023.08.10

4858

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习