【C++ 基于微服务的即时通讯系统】基建三件套:gflags + gtest + spdlog 源码编译安装与实战入门
草莓熊Lotso个人主页❄️个人专栏:《C知识分享》 《Linux 入门到实践零基础也能懂》✨生活是默默的坚持毅力是永久的享受 博主简介前言做 C 高性能后端开发这么多年我见过太多新人一头扎进业务逻辑里却忽略了最基础的工程化工具。命令行参数靠手搓、打日志全用 printf、单元测试全靠肉眼跑不仅开发效率低出了问题排查起来更是灾难。尤其是做 Redis 二次开发、微服务组件这类底层项目gflags、gtest、spdlog 这三个基本是行业标配gflags 搞定灵活的命令行参数管理gtest 守住单元测试的质量关spdlog 提供高性能的日志输出。今天就带大家从源码编译开始从零到一搞定这三个工具的安装和基础使用路上踩过的坑都给大家标得明明白白。一. gflagsGoogle 命令行参数解析库1.1 工具简介gflags 是 Google 开源的命令行参数解析库相比 C 标准库的 getopt它的优势非常突出支持类型安全的参数定义自动做类型校验不用自己写转换逻辑参数可以分散定义在各个源文件中全局生效非常适合大型多模块项目原生支持默认值、参数说明、布尔参数快捷开关很多知名开源项目brpc、leveldb、Ceph都在使用是 C 项目的事实标准之一1.2 源码编译与安装这里我们用官方源码编译安装避免系统包管理器版本过旧、特性缺失的问题。步骤 1下载源码gitclone https://github.com/gflags/gflags.gitcdgflags步骤 2CMake 配置推荐单独创建 build 目录做外编译避免污染源码目录。mkdirbuildcdbuild# 配置安装路径到/usr/local编译动态库cmake..\-DCMAKE_INSTALL_PREFIX/usr/local\-DBUILD_SHARED_LIBSON\-DGFLAGS_BUILD_STATIC_LIBSOFF踩坑提醒默认情况下 gflags 只编译静态库必须加上BUILD_SHARED_LIBSON才会生成动态库方便后续项目动态链接。步骤 3编译与安装# 并行编译核心数根据自己机器配置调整make-j$(nproc)# 安装到系统目录sudomakeinstall步骤 4验证安装安装完成后可以用 pkg-config 查看版本确认安装成功pkg-config--modversiongflags正常输出版本号就说明安装路径、库文件都没问题。1.3 基础使用示例我们写一个最简单的 Redis 连接参数示例看看 gflags 在实际项目里怎么用。创建demo_gflags.cpp#includeiostream#includegflags/gflags.h// 定义命令行参数类型参数名默认值参数说明DEFINE_string(redis_host,127.0.0.1,Redis服务器地址);DEFINE_int32(redis_port,6379,Redis服务器端口);DEFINE_bool(enable_debug_log,true,是否开启调试日志);intmain(intargc,char*argv[]){// 解析命令行参数第三个参数表示是否移除已解析的参数google::ParseCommandLineFlags(argc,argv,true);std::cout正在连接RedisFLAGS_redis_host:FLAGS_redis_portstd::endl;std::cout调试日志状态std::boolalphaFLAGS_enable_debug_logstd::endl;return0;}编译运行g demo_gflags.cpp-odemo_gflags-lgflags# 默认参数运行./demo_gflags# 传参运行./demo_gflags--redis_host192.168.1.100--redis_port6380--noenable_debug_log可以看到通过--参数名值的方式就能传入参数布尔参数还支持--no参数名的快捷关闭方式非常符合工程使用习惯。二. gtestGoogle 单元测试框架2.1 工具简介gtestGoogle Test是目前 C 领域最主流的单元测试框架功能全面且上手简单提供丰富的断言宏覆盖值判断、布尔判断、字符串比较、浮点数比较等场景支持测试套件、测试用例的分层组织代码结构清晰支持死亡测试、类型参数化、值参数化等高级测试功能配合 gmock 可以实现接口 Mock适合复杂依赖的项目做单元隔离2.2 源码编译与安装现在 gtest 和 gmock 已经合并在同一个官方仓库里一次编译就能全部安装。步骤 1下载源码gitclone https://github.com/google/googletest.gitcdgoogletest步骤 2CMake 配置mkdirbuildcdbuild cmake..\-DCMAKE_INSTALL_PREFIX/usr/local\-DBUILD_SHARED_LIBSON\-DINSTALL_GTESTON注意部分老版本 gtest 默认不开启安装选项加上INSTALL_GTESTON更稳妥保证执行 make install 时能正确安装头文件和库。步骤 3编译与安装make-j$(nproc)sudomakeinstall安装完成后系统会生成 gtest、gtest_main、gmock、gmock_main 四个库以及对应的头文件。2.3 基础使用示例我们写一个简单的字符串工具函数然后用 gtest 编写单元测试。创建demo_gtest.cpp#includegtest/gtest.h#includestring#includecctype// 待测试的函数字符串转大写std::stringstringToUpper(conststd::stringstr){std::string resultstr;for(charch:result){chstatic_castchar(toupper(ch));}returnresult;}// 测试用例第一个参数是测试套件名第二个是测试用例名TEST(StringUtilTest,ToUpperNormalString){EXPECT_EQ(stringToUpper(hello redis),HELLO REDIS);EXPECT_EQ(stringToUpper(spdlog),SPDLOG);}TEST(StringUtilTest,ToUpperEmptyString){EXPECT_EQ(stringToUpper(),);}TEST(StringUtilTest,ToUpperAlreadyUpper){EXPECT_EQ(stringToUpper(GTEST),GTEST);}intmain(intargc,char*argv[]){testing::InitGoogleTest(argc,argv);returnRUN_ALL_TESTS();}编译运行g demo_gtest.cpp-odemo_gtest-lgtest-lpthread./demo_gtest运行后会输出完整的测试结果每个用例是否通过、耗时多少都一目了然。如果有断言失败还会精准定位到代码行号排查问题非常高效。三. spdlog高性能 C 日志库3.1 工具简介spdlog 是现在 C 圈子里最主流的高性能日志库性能和易用性都拉满支持 header-only 模式也可以编译成库使用集成非常方便性能远超 log4cpp、glog 等传统日志库异步模式下能达到每秒百万级日志输出支持多种日志级别、多种输出目标控制台、文件、滚动文件、syslog 等原生支持 fmt 格式化用法和 Python 的 format 类似写起来非常顺手做高性能服务、Redis 组件开发的话日志绝对不能成为性能瓶颈spdlog 基本是首选。3.2 源码编译与安装spdlog 有两种使用方式直接复制头文件使用或者编译成库安装。这里我们用编译安装的方式更适合正规项目。步骤 1下载源码gitclone https://github.com/gabime/spdlog.gitcdspdlog步骤 2CMake 配置mkdirbuildcdbuild cmake..\-DCMAKE_INSTALL_PREFIX/usr/local\-DSPDLOG_BUILD_SHAREDON\-DSPDLOG_FMT_EXTERNALOFF说明SPDLOG_FMT_EXTERNALOFF表示使用 spdlog 自带的 fmt 库不用系统单独安装 fmt减少外部依赖。补充如果是小型项目也可以不用编译直接把源码里的include/spdlog目录复制到项目头文件路径里spdlog 是 header-only 的直接包含就能用零依赖。步骤 3编译与安装make-j$(nproc)sudomakeinstall3.3 基础使用示例创建demo_spdlog.cpp演示控制台日志和文件日志的基础用法#includespdlog/spdlog.h#includespdlog/sinks/basic_file_sink.hintmain(){// 设置全局日志级别spdlog::set_level(spdlog::level::debug);// 控制台输出不同级别的日志spdlog::info(Redis连接成功地址{}:{},127.0.0.1,6379);spdlog::debug(当前连接池数量{},8);spdlog::warn(Redis内存使用率超过80%);spdlog::error(写入Key失败key{},user:profile:1001);// 创建文件日志器输出到app.logautofile_loggerspdlog::basic_logger_mt(file_logger,app.log);file_logger-info(服务启动完成运行正常);return0;}编译运行g demo_spdlog.cpp-odemo_spdlog-lspdlog-lpthread./demo_spdlog运行后控制台会输出带时间戳、带颜色的格式化日志同时当前目录下会生成app.log文件里面也有对应的日志内容。四. 三套件整合CMake 项目实战单独使用没问题实际项目里一般是三个工具搭配使用。这里给大家一个完整的 CMakeLists.txt 示例演示怎么把三个工具规范地整合到一个项目里。项目目录结构redis_demo/ ├── CMakeLists.txt ├── src/ │ └── main.cpp └── test/ └── test_main.cppCMakeLists.txtcmake_minimum_required(VERSION 3.10) project(redis_demo) # 使用C17标准 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 查找系统中的依赖库 find_package(gflags REQUIRED) find_package(GTest REQUIRED) find_package(spdlog REQUIRED) # 主程序 add_executable(redis_demo src/main.cpp) target_link_libraries(redis_demo gflags::gflags spdlog::spdlog pthread ) # 单元测试程序 enable_testing() add_executable(unit_test test/test_main.cpp) target_link_libraries(unit_test GTest::gtest GTest::gtest_main pthread ) add_test(NAME unit_test COMMAND unit_test)这样配置之后直接用 cmake 编译就能自动链接三个库工程结构清晰依赖管理规范。五. 核心要点总结最后给大家提炼一下这三个工具安装和使用的核心要点帮大家避开常见的坑优先源码编译安装系统包管理器的版本往往滞后很多源码编译可以自由控制版本也能根据需求开启或关闭特性更好地适配自己的编译环境。动静态库按需选择开发阶段推荐用动态库编译速度快发布部署阶段可以用静态库减少运行时依赖根据自己的场景选择即可。工具定位清晰分工gflags 管参数配置、gtest 管单元测试、spdlog 管日志输出三者各司其职是 C 后端项目的标准工程化配置。注意库路径配置默认安装到/usr/local下一般不需要额外配置路径如果安装到自定义目录记得把库路径加到LD_LIBRARY_PATH环境变量里避免运行时找不到动态库。结语 我是草莓熊 Lotso若这篇技术干货帮你打通了学习中的卡点 【关注】跟我一起深耕技术领域从基础到进阶见证每一次成长 ❤️ 【点赞】让优质内容被更多人看见让知识传递更有力量 ⭐ 【收藏】把核心知识点、实战技巧存好需要时直接查、随时用 【评论】分享你的经验或疑问比如曾踩过的技术坑一起交流避坑 ️ 【投票】用你的选择助力社区内容方向告诉大家哪个技术点最该重点拆解 技术之路难免有困惑但同行的人会让前进更有方向愿我们都能在自己专注的领域里一步步靠近心中的技术目标结语其实做底层开发越久越能体会到 “工欲善其事必先利其器” 的道理。这三个工具看似都是不起眼的基础组件却是整个项目工程化的基石。参数管理规范了测试覆盖到位了日志输出清晰了后面开发业务、排查问题才能事半功倍。后续我也会继续分享更多 C 后端、Redis 相关的开发技巧和底层原理大家有什么想看的内容或者编译安装遇到什么问题欢迎在评论区留言交流。✨把这些内容吃透超牛的放松下吧✨ʕ˘ᴥ˘ʔづきらど

相关新闻

C语言预处理机制详解:宏定义、条件编译与头文件包含避坑指南

C语言预处理机制详解:宏定义、条件编译与头文件包含避坑指南

1. 预处理在编译流程中的位置很多刚开始学C语言的人,会把注意力全放在语法、指针、结构体这些“看得见”的部分上,但真正到了项目里,第一个让你摔跟头的往往不是语法,而是预处理指令。它不参与具体的逻辑计算,却在编译…

2026/10/12 3:54:21 阅读更多 →
AI工程师不加班成长指南:把工作变训练场的高效学习法

AI工程师不加班成长指南:把工作变训练场的高效学习法

晚上十一点,我刚把一个数据管线的 bug 处理完,打开收藏夹里积压了两个月的论文列表,脑子已经完全转不动了。这种情景在过去两年里反复出现:白天被会议、需求评审、调试代码塞满,晚上想学点新东西却连打开文档的力气都没…

2026/10/12 3:54:21 阅读更多 →
Z-Gly-Gly-Arg-ΒNA;17278-97-6

Z-Gly-Gly-Arg-ΒNA;17278-97-6

基本性质中文名称:苄氧羰基 - 甘氨酰 - 甘氨酰 - 精氨酸 -β- 萘胺,蛋白酶体胰蛋白酶样活性荧光底物CAS 号:17278-97-6单字母序列:Z-G-G-R-βNA三字母序列:Z-Gly-Gly-Arg-βNA分子式:C₂₈H₃₃N₇O₅分子量…

2026/10/12 3:53:20 阅读更多 →

最新新闻

量子开发者人才缺口百万?入门技能图谱与实操路径全解析

量子开发者人才缺口百万?入门技能图谱与实操路径全解析

一份“2030年量子开发人才缺口达百万”的预测,最近在朋友圈被转得很猛。我第一反应是:这数字靠不靠谱先放一边,“量子开发者”到底是个什么工种,多数人其实说不清楚。作为写过几年经典软件、又花了不少时间钻进量子计算这个交叉领…

2026/10/12 4:44:49 阅读更多 →
闲置PS5变身标准媒体终端与测试机:AnyPS5配置指南

闲置PS5变身标准媒体终端与测试机:AnyPS5配置指南

把“AnyPS5”这个名字扔上来的时候,估计会有人下意识往越狱、固化那类方向想。我先把话说清楚:我这里的AnyPS5不是破解工具,也不是某个隐藏系统,而是我这段时间在工作室里把几台PS5翻来覆去折腾之后,沉淀出来的一套“任…

2026/10/12 4:44:49 阅读更多 →
Excel 关键指标 Top-N 高亮导出实战:SenseNova-Skills top-value-coloring 技能深度解析

Excel 关键指标 Top-N 高亮导出实战:SenseNova-Skills top-value-coloring 技能深度解析

AI 技能人工智能深度研究数据分析媒体生成 【免费下载链接】SenseNova-Skills Modular SenseNova skills for building AI-powered office assistants and productivity workflows 项目地址: https://gitcode.com/gh_mirrors/se/SenseNova-Skills 点击查看 免费下载…

2026/10/12 4:44:49 阅读更多 →
OpenCore Legacy Patcher 完整指南:2007—2017 老 Mac 免费安装 macOS Big Sur 到 Sequoia 新系统

OpenCore Legacy Patcher 完整指南:2007—2017 老 Mac 免费安装 macOS Big Sur 到 Sequoia 新系统

OpenCore Legacy Patcher 完整指南:2007—2017 老 Mac 免费安装 macOS Big Sur 到 Sequoia 新系统 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher …

2026/10/12 4:44:49 阅读更多 →
Claude Code + MCP 实操:从空文件夹到可玩 Unity 游戏的全自动开发闭环

Claude Code + MCP 实操:从空文件夹到可玩 Unity 游戏的全自动开发闭环

开年这几个月,AI 辅助编程的玩法算是彻底变天了。以前大家讨论的是"AI 能不能帮你写代码",现在的问题已经变成"AI 能不能直接替你完成一个独立开发者的全套工作流"。我今天想聊的,就是我最近反复折腾又实测过好几轮的完整…

2026/10/12 4:44:49 阅读更多 →
OpenClaw技能合集:从Clawdbot到Moltbot的Agent Skill精选与TaoToken接入实践

OpenClaw技能合集:从Clawdbot到Moltbot的Agent Skill精选与TaoToken接入实践

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

2026/10/12 4:43:48 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 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/11 10:45:37 阅读更多 →
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/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练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/11 14:36:54 阅读更多 →