Windows下spdlog日志库编译与使用指南
1. spdlog简介与Windows环境准备spdlog是一个高性能的C日志库以其简洁的API和出色的性能著称。作为header-only库它只需要包含头文件即可使用但实际项目中我们更推荐编译为静态库以获得更好的编译速度。在Windows平台使用spdlog前需要准备以下环境Visual Studio 2015或更高版本推荐VS2019/VS2022CMake 3.10以上版本Git客户端用于获取源码Windows SDK通常随VS安装注意虽然spdlog支持C11但建议使用C17以获得完整功能体验。在VS中可通过项目属性-C/C-语言-C语言标准进行设置。2. 源码获取与编译配置2.1 获取源码推荐使用Git克隆官方仓库git clone https://github.com/gabime/spdlog.git cd spdlog如果网络环境受限也可以直接下载release版本的zip包。截至本文撰写时最新稳定版为v1.11.0。2.2 CMake配置创建build目录并生成VS解决方案mkdir build cd build cmake .. -G Visual Studio 16 2019 -A x64 -DSPDLOG_BUILD_EXAMPLEOFF关键参数说明-G指定生成器版本应与你的VS版本匹配-A x64指定64位架构推荐-DSPDLOG_BUILD_EXAMPLEOFF禁用示例构建首次学习时可设为ON2.3 编译选项解析spdlog提供多个有用的编译选项选项名称默认值说明SPDLOG_BUILD_SHAREDOFF构建动态库而非静态库SPDLOG_WCHAR_SUPPORTOFF启用宽字符日志支持SPDLOG_INSTALLOFF生成安装目标SPDLOG_FMT_EXTERNALOFF使用外部fmt库而非内置版本例如需要支持宽字符日志并构建为动态库cmake .. -DSPDLOG_WCHAR_SUPPORTON -DSPDLOG_BUILD_SHAREDON3. Visual Studio中的编译实战3.1 解决方案生成成功执行CMake后会在build目录生成spdlog.sln。用VS打开该解决方案可以看到以下主要项目spdlog主库spdlog_benchmark性能测试spdlog_tests单元测试3.2 编译与安装在VS中将解决方案配置设为Release和x64右键spdlog项目-生成可选右键INSTALL-生成进行安装编译产物说明静态库spdlog.lib位于build/Debug或build/Release动态库spdlog.dll spdlog.lib导入库实测建议在x64 Release模式下静态库大小约500KB动态库约300KB不含调试符号。4. 项目集成与使用示例4.1 基础集成方法将以下内容添加到你的项目中包含目录添加spdlog/include库目录添加build/Release附加依赖项添加spdlog.lib或者使用CMake集成find_package(spdlog REQUIRED) target_link_libraries(your_target PRIVATE spdlog::spdlog)4.2 基础使用示例#include spdlog/spdlog.h #include spdlog/sinks/basic_file_sink.h int main() { // 控制台日志 spdlog::info(Welcome to spdlog!); spdlog::error(Some error message); // 文件日志 auto file_logger spdlog::basic_logger_mt(file_logger, logs/basic.txt); file_logger-info(File log test); // 格式化日志 spdlog::set_pattern([%H:%M:%S %z] [%n] [%^%l%$] %v); spdlog::info(Formatted message with arg: {}, 42); // 刷新所有日志 spdlog::shutdown(); return 0; }4.3 高级特性示例异步日志推荐生产环境使用auto async_file spdlog::basic_logger_mtspdlog::async_factory( async_file_logger, logs/async.txt);多接收器日志同时输出到控制台和文件auto multi_logger std::make_sharedspdlog::logger(multi_sink); multi_logger-sinks().push_back(std::make_sharedspdlog::sinks::stdout_color_sink_mt()); multi_logger-sinks().push_back(std::make_sharedspdlog::sinks::basic_file_sink_mt(multi.txt)); spdlog::register_logger(multi_logger);5. 性能优化与问题排查5.1 性能优化建议生产环境务必使用异步日志避免频繁创建/销毁logger实例对于高频日志使用宏定义控制日志级别#define LOG_TRACE SPDLOG_LOGGER_TRACE #define LOG_DEBUG SPDLOG_LOGGER_DEBUG // 发布版本可定义为空宏使用SPDLOG_ACTIVE_LEVEL控制编译时日志级别#define SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_INFO // 只编译INFO及以上级别5.2 常见问题解决问题1LNK2005符号重复定义解决方案确保项目设置为使用动态CRT/MD或/MDd检查是否有多个模块包含spdlog实现应只有一个模块定义SPDLOG_COMPILED_LIB问题2日志文件不生成检查点程序是否有写入权限目录是否存在spdlog不会自动创建目录是否调用了spdlog::shutdown()问题3性能瓶颈优化方法使用spdlog::set_pattern()优化格式避免复杂格式增大异步队列大小默认8192spdlog::init_thread_pool(8192, 1); // 队列大小线程数6. Windows平台特别注意事项Unicode支持 启用SPDLOG_WCHAR_SUPPORT后可使用wchar_t APIspdlog::warn(L宽字符消息: {}, 42);控制台颜色 Windows控制台需启用VT100转义序列#include windows.h SetConsoleMode(GetStdHandle(STD_OUTPUT_HANDLE), ENABLE_VIRTUAL_TERMINAL_PROCESSING);动态库使用 如果构建为DLL需在导出模块中定义#define SPDLOG_API __declspec(dllexport)在使用模块中定义#define SPDLOG_API __declspec(dllimport)崩溃处理 Windows下可添加崩溃日志捕获#include spdlog/sinks/msvc_sink.h auto msvc_sink std::make_sharedspdlog::sinks::msvc_sink_mt(); logger-sinks().push_back(msvc_sink);7. 进阶应用场景7.1 日志文件轮转使用daily_file_sink实现每日日志#include spdlog/sinks/daily_file_sink.h auto daily_logger spdlog::daily_logger_mt(daily, logs/daily.txt, 0, 0);或使用rotating_file_sink按大小轮转#include spdlog/sinks/rotating_file_sink.h auto rotating_logger spdlog::rotating_logger_mt(rotating, logs/rotating.txt, 1024*1024*5, 3);7.2 网络日志通过udp_sink发送日志到远程服务器#include spdlog/sinks/udp_sink.h auto udp_sink std::make_sharedspdlog::sinks::udp_sink_mt(127.0.0.1, 514);7.3 系统日志记录到Windows事件日志#include spdlog/sinks/win_eventlog_sink.h auto event_logger spdlog::win_eventlog_logger_mt(eventlog, MyApp);8. 性能对比数据在i7-11800H Windows 11平台测试Release x64场景吞吐量msg/sec平均延迟μs同步控制台1,200,0000.83异步控制台8,500,0000.12同步文件SSD850,0001.18异步文件SSD6,200,0000.16同步每日文件620,0001.61异步每日文件5,800,0000.17测试命令需编译benchmark项目spdlog_benchmark async 8 4096 # 8线程队列大小4096

相关新闻

Unity ASCII FBX导出插件:调试与数据验证的利器

Unity ASCII FBX导出插件:调试与数据验证的利器

1. 项目概述与核心价值最近在Unity项目里处理模型资产时,你是不是也遇到过这样的头疼事:从Unity编辑器里导出的FBX文件,拿到其他3D软件里一打开,材质贴图路径全乱了,或者动画数据对不上号,排查起来简直像大…

2026/10/19 15:49:32 阅读更多 →
Frida动态Hook解密Cocos2d-JS手游so加密脚本实战

Frida动态Hook解密Cocos2d-JS手游so加密脚本实战

1. 项目概述与核心价值 最近在分析一些老旧的Cocos2d-JS手游时,发现一个挺有意思的现象:很多游戏的核心逻辑和资源都打包在 .so 动态链接库里,尤其是脚本部分,往往经过了加密或混淆。直接静态分析IDA,看到的是一堆乱…

2026/10/20 3:23:40 阅读更多 →
Unity多人游戏开发利器:ParrelSync原理、跨平台配置与高效测试指南

Unity多人游戏开发利器:ParrelSync原理、跨平台配置与高效测试指南

1. 项目概述:为什么我们需要ParrelSync?在Unity多人游戏开发中,有一个场景是所有开发者都绕不开的痛点:本地测试。想象一下,你正在开发一个双人合作的解谜游戏,或者一个支持4人同屏对战的竞技游戏。按照传统…

2026/10/20 15:36:13 阅读更多 →

最新新闻

科创知识图谱:破解科技成果转化中信息孤岛与供需匹配难题

科创知识图谱:破解科技成果转化中信息孤岛与供需匹配难题

接手这个项目之前,我对“成果转化难”这几个字的理解其实非常抽象。直到有一次,某高校技术转移中心的一位老师当着我的面,为了给一家企业找“能做钙钛矿电池产业化的团队”,翻了整整一下午的论文、专利、结题报告和朋友圈&#xf…

2026/10/20 23:16:46 阅读更多 →
推荐系统中的PID流量调控:曝光占比从4%到20%的闭环实战

推荐系统中的PID流量调控:曝光占比从4%到20%的闭环实战

推荐系统策略做到后面,你会发现最头疼的不是模型AUC涨不涨,而是那些没法用模型直接解决的目标——比如某个内容池子的曝光占比就是不够。PID流量调控,说白了就是干这个的:把自动控制领域那个经典的PID控制器,搬到推荐分…

2026/10/20 23:16:46 阅读更多 →
华为GVRP配置详解:三种注册模式与单向注册排障指南

华为GVRP配置详解:三种注册模式与单向注册排障指南

简介:华为GVRP实验配置文档面向网络工程师、华为设备学习者及备考认证考生,记录了S1至S4四台交换机部署GVRP协议的配置全过程。文档从普通、固定、禁止三种注册模式的原理讲起,给出各交换机接口均设为Trunk、允许所有VLAN通过并开启GVRP的具体…

2026/10/20 23:16:46 阅读更多 →
Ubuntu 20.04 LTS 安装与初始化:Rufus写盘到APT配置全记录

Ubuntu 20.04 LTS 安装与初始化:Rufus写盘到APT配置全记录

简介:这份指南是一份面向Linux新手与开发者的系统性安装配置教程,重点覆盖Ubuntu 20.04 LTS从镜像下载、Rufus启动盘制作、BIOS/UEFI启动顺序调整,到磁盘分区选择、账户创建及系统初始化设置的完整链路。资源以1个docx文档承载全部内容&#…

2026/10/20 23:16:46 阅读更多 →
Spring Boot来访管理系统实战:从表结构设计到核心接口落地

Spring Boot来访管理系统实战:从表结构设计到核心接口落地

简介:基于Spring Boot框架的来访管理系统源码包,面向需要开发访客登记、预约与来访统计场景的Web开发者,覆盖管理员与访客两类角色,包含个人中心、访客管理、访客预约管理、访客来访管理等核心模块,体现前后端分离的分…

2026/10/20 23:16:46 阅读更多 →
车载Android音频HAL Server启动全流程拆解:从init到AudioFlinger

车载Android音频HAL Server启动全流程拆解:从init到AudioFlinger

车载Android项目里,音频问题占了启动阶段很大一部分工作量。一开机没声音、开机声音卡顿、语音助手唤醒失败、电话切音区不生效,追到最底层,几乎都会汇聚到一个进程:Audio HAL Server。很多同学知道有这么一个vendor进程&#xff…

2026/10/20 23:15:44 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →