现代C++工具集锦:从spdlog到nlohmann/json的高效开发指南
1. 项目概述为什么我们需要一个现代 C 工具集锦如果你是一名 C 开发者无论是刚入行的新手还是在大型项目中摸爬滚打多年的老手大概率都经历过这样的场景面对一个新需求比如需要一个高性能的日志库或者一个易用的 JSON 解析器你打开搜索引擎输入“C logging library”然后面对海量的搜索结果感到茫然。spdlog、glog、log4cplus、easylogging... 哪个才是当下社区的主流选择哪个文档最全、性能最好、最符合现代 C 的编码风格又或者你想学习某个特定领域比如游戏引擎或网络框架却发现资料零散难以找到一个系统性的、经过筛选的优秀项目列表来作为学习起点。这正是“一站式现代 C 项目开源工具集锦”存在的意义。它不是一个简单的列表而是一个经过精心筛选、分类和整理的导航地图。其核心价值在于它试图解决 C 生态中一个长期存在的痛点信息过载与筛选成本过高。C 历史悠久社区庞大开源项目浩如烟海但质量参差不齐技术栈新旧混杂。一个新手甚至是有经验的开发者要从中快速定位到符合“现代 C”通常指 C11/14/17/20 及以后理念、代码质量高、文档齐全、社区活跃的项目需要耗费大量的时间和精力去试错。这个集锦项目本质上是一个元工具。它不直接提供某个具体的功能如日志记录而是为你提供一张通往这些功能最佳实现的“藏宝图”。它帮你完成了前期繁琐的调研、比较和筛选工作将散落在 GitHub、GitLab 等各处的珍珠优秀项目串联起来并按照清晰的逻辑如日志、网络、图形、数据结构等进行分类展示。对于学习者它是绝佳的学习路线图和实践素材库对于工程实践者它是高效的“技术选型”参考手册能极大缩短项目前期的技术调研周期。2. 集锦内容深度解析从“能用”到“好用”的跨越一个优秀的工具集锦其价值不仅在于“收录了什么”更在于“如何组织”和“为何收录”。我们以几个关键分类为例深入剖析这份集锦背后的逻辑。2.1 基础工具库构建项目的基石任何稍具规模的 C 项目都离不开一些基础组件的支撑。集锦中这部分内容最为丰富也最能体现“现代”二字的含义。日志库 (Logging):这是观察程序行为的“眼睛”。集锦中收录的spdlog和fmt组合几乎是现代 C 项目的标配。spdlog基于fmt库提供了极快的格式化速度和异步日志支持其 API 设计也非常符合 C11/14 的习惯。相比之下传统的glogGoogle虽然功能强大但在接口现代性和灵活性上稍逊一筹。easylogging则以其极简的集成方式著称。集锦的收录标准显然是高性能、易用性、与现代 C 标准兼容。实操心得在中小型项目或对性能要求极高的服务中我通常会首选spdlog。它的异步模式spdlog::async_logger能有效避免日志 I/O 阻塞主线程只需几行代码即可配置。但对于需要与现有 Google 技术栈深度集成的项目glog可能是更稳妥的选择因为它与 gflags、gtest 等同门兄弟配合得天衣无缝。参数解析 (Argument Parsing):命令行工具是 C 的常见应用场景。传统的getopt功能有限且使用繁琐。集锦中推荐的CLI11和cxxopts代表了两种现代风格。CLI11采用声明式 API通过定义结构体或变量来声明参数自动生成帮助信息类型安全且代码清晰。cxxopts则提供了类似boost::program_options的流畅接口但更为轻量。它们的共同点是告别了手动解析argv的原始时代。序列化与数据交换 (Serialization):JSON 和 Protocol Buffers 是跨语言数据交换的事实标准。nlohmann/json这个库将 C 中处理 JSON 的体验提升到了前所未有的高度。它支持类似json[“key”]的直观语法并能与 STL 容器、自定义类型通过to_json/from_jsonADL无缝转换真正做到了“像脚本语言一样写 JSON”。对于嵌入式或高性能场景rapidjson虽未在片段中列出但也是重要选择是另一个标杆。而nanopb则是为资源受限环境量身定制的 Protobuf 实现。2.2 并发与异步驾驭多核时代的利器现代 CPU 的核心数越来越多并发编程从“高级技能”变成了“必备技能”。集锦在这方面提供了从底层原语到高层框架的全套方案。线程池与任务系统:直接使用std::thread创建线程是笨重且低效的。taskflow是一个现代 C 并行任务编程库它允许你以图Graph的形式定义任务之间的依赖关系然后自动调度执行。这对于处理有复杂依赖关系的计算流水线非常有用。而像thread-pool这样的库则提供了更简单直接的线程池模型适合“任务队列工作者线程”这种经典模式。协程与异步 I/O:C20 正式引入了协程Coroutines但标准库只提供了最基础的设施。社区中libco腾讯和PhotonLibOS阿里巴巴是生产级的高性能协程库代表。PhotonLibOS不仅提供了用户态线程协程还集成了高性能的网络、RPC、HTTP 等组件在阿里巴巴内部广泛使用其设计思想值得深入研究。对于网络编程Boost.Asio是异步 I/O 的基石而libuvNode.js 底层则提供了跨平台的事件循环抽象。搜狗的workflow框架更进一步将异步调度、网络、计算等统一起来提供了更高层次的编程范式。注意事项选择并发框架时必须考虑与项目其他部分的兼容性。例如如果你的项目大量使用了Boost那么Boost.Asio是自然之选。如果追求极致的性能和特定的调度模型如 Work-stealing则需要深入测试taskflow或PhotonLibOS。切忌在一个项目中混用多种不兼容的并发模型这会导致复杂的死锁和难以调试的竞态条件。2.3 网络与通信从 Socket 到微服务网络是分布式系统的血脉。集锦覆盖了从底层协议解析到高层应用框架的完整链条。HTTP/Web 领域:Drogon和Crow是两个风格迥异的现代 C Web 框架。Drogon是一个全功能的、高性能的异步 HTTP 应用框架内置 ORM、模板引擎等适合快速开发 API 服务。它的异步模型基于Boost.Asio性能出色。Crow则极其轻量是一个“微框架”其 API 设计灵感来源于 Python 的 Flask几行代码就能启动一个 HTTP 服务器非常适合快速原型开发或构建简单的微服务。picohttpparser是一个极简的 HTTP 协议解析器常用于需要嵌入式 HTTP 支持的场景比如在自定义的服务器中解析请求头。RPC 与序列化:微服务架构下RPC远程过程调用是关键。srpc是基于搜狗workflow的 RPC 框架性能强劲。grpcGoogle是跨语言的 RPC 框架标准基于 HTTP/2 和 Protobuf生态庞大。集锦可能还收录了像brpc百度这样的工业级 RPC 框架它集成了多种协议、负载均衡、熔断等治理功能。选择时生态兼容性如是否已使用 Protobuf和性能要求是首要考量。数据库与存储:SQLiteCpp和sqlite_orm是对嵌入式数据库 SQLite 的两种不同风格的 C 封装。前者是轻量级的 C 包装后者是一个完整的 ORM对象关系映射库允许你使用 C 类来操作数据库表减少了手写 SQL 的繁琐。对于高性能 KV 存储RocksDBFacebook是无可争议的王者它源自 Google 的 LevelDB并增加了大量企业级特性如压缩、事务、多线程等是许多分布式数据库如 TiDB、CockroachDB的存储引擎。3. 如何高效使用这个工具集锦从检索到集成拥有宝库地图还需要知道如何按图索骥。面对成百上千的项目如何快速找到你需要的那个3.1 建立分类思维与检索路径首先你需要明确自己的需求属于哪个大类。集锦通常按功能域分类这是最直接的检索路径明确需求我需要一个日志库 - 查看“日志记录”或“C/C 实用工具库 编程辅助”分类。浏览简介快速扫读每个项目的简介关注关键词仅头文件 (header-only)、高性能 (high-performance)、C11/14/17、异步 (asynchronous)。初步筛选根据项目活跃度GitHub Stars、最近提交时间、文档完整性README 是否清晰、许可证是否适合商业项目进行第一轮筛选。对于复杂需求可能需要交叉检索。例如想开发一个高性能的数据处理服务可能同时需要网络框架如Drogon序列化库如nlohmann/json或protobuf并发工具如taskflow数据库客户端如sqlite_orm或RocksDB 这时你需要分别在“网络”、“数据格式”、“并发”、“数据库”分类下寻找并评估它们之间的兼容性。3.2 评估与选型的关键维度找到几个候选项目后如何做出最终选择我通常会从以下几个维度进行深度评估1. 代码质量与工程实践打开 GitHub 仓库查看src目录下的代码结构是否清晰。阅读核心头文件观察 API 设计是否直观、符合现代 C 习惯如使用智能指针、移动语义、lambda 表达式。检查测试覆盖率是否有完善的单元测试tests/目录这直接反映了项目的可靠性和维护者的专业程度。查看 CI/CD 配置如.github/workflows或.travis.yml看是否在多个平台和编译器下进行自动化测试。2. 社区生态与维护状态最近提交查看commits历史如果最近一年都没有更新可能项目已停滞。Issue 和 PR打开和关闭的 Issue 数量、维护者响应速度、PR 合并情况能反映社区的活跃度。依赖关系在项目的CMakeLists.txt或README中查看其依赖。依赖是否过多、过重依赖的库本身是否稳定文档与示例是否有详细的README.md、docs/目录、examples/示例代码一个优秀的库必然有优秀的文档。3. 集成与构建难度构建系统项目使用 CMake、Bazel、Makefile 还是仅头文件这决定了它集成到你现有项目中的成本。现代 C 项目普遍优先选择CMake因为其生态最好。仅头文件库如spdlog需配合fmt、nlohmann/json、cxxopts等集成最简单只需#include即可但可能会增加编译时间。平台与编译器支持明确说明支持 GCC、Clang、MSVC 哪些版本是否支持 Windows、Linux、macOS。4. 性能基准如有一些库会提供基准测试数据如spdlog会对比其他日志库的速度。对于网络、序列化等对性能敏感的场景这至关重要。你可以参考但最好在自己的实际场景中做一次压测。3.3 实战集成示例以 spdlog 和 nlohmann/json 为例假设我们有一个新的控制台应用程序项目使用 CMake 构建需要集成日志和 JSON 解析。步骤 1: 使用包管理器或 FetchContent 引入现代 CMake 推荐使用FetchContent或find_package如果库已通过系统包管理器安装。# CMakeLists.txt cmake_minimum_required(VERSION 3.14) project(MyModernApp) set(CMAKE_CXX_STANDARD 17) # 方法一使用 FetchContent (适用于大多数 GitHub 项目) include(FetchContent) FetchContent_Declare( spdlog GIT_REPOSITORY https://github.com/gabime/spdlog.git GIT_TAG v1.x # 指定一个稳定版本标签 ) FetchContent_Declare( nlohmann_json GIT_REPOSITORY https://github.com/nlohmann/json.git GIT_TAG v3.11.2 ) FetchContent_MakeAvailable(spdlog nlohmann_json) # 现在spdlog::spdlog 和 nlohmann_json::nlohmann_json 目标已可用 add_executable(my_app main.cpp) target_link_libraries(my_app PRIVATE spdlog::spdlog nlohmann_json::nlohmann_json)步骤 2: 在代码中使用// main.cpp #include spdlog/spdlog.h #include spdlog/sinks/stdout_color_sinks.h // 彩色控制台输出 #include nlohmann/json.hpp #include iostream using json nlohmann::json; int main() { // 1. 初始化日志器 auto console_logger spdlog::stdout_color_mt(console); spdlog::set_default_logger(console_logger); spdlog::set_level(spdlog::level::debug); // 设置全局日志级别 // 2. 使用 JSON 库 json j; j[name] MyModernApp; j[version] 1.0; j[dependencies] {spdlog, nlohmann_json}; // 序列化输出字符串 std::string json_str j.dump(2); // 缩进2个空格美化输出 spdlog::info(App config: \n{}, json_str); // 反序列化解析字符串 json j2 json::parse(R({status: ok, code: 200})); int code j2[code]; spdlog::debug(Parsed code: {}, code); // 3. 记录不同级别的日志 spdlog::trace(This is a trace message.); spdlog::debug(This is a debug message.); spdlog::info(Integration successful!); spdlog::warn(This is a warning.); spdlog::error(This is an error.); return 0; }步骤 3: 编译与运行mkdir build cd build cmake .. make -j4 ./my_app你将看到彩色的日志输出和格式化的 JSON 内容。避坑技巧对于spdlog在生产环境中建议使用异步日志器(spdlog::create_async) 并将日志输出到文件以避免控制台 I/O 阻塞和性能波动。同时可以为不同的模块创建不同的日志器实例方便过滤和管理。4. 超越工具集锦构建个人知识体系与技术雷达工具集锦是学习的起点而非终点。真正的价值在于利用它作为跳板构建你自己的 C 技术栈和知识体系。4.1 建立“技术雷达”与持续更新你可以借鉴 ThoughtWorks 技术雷达的形式为自己维护一个简单的“个人 C 技术雷达”分为四个象限采纳 (Adopt):你已经熟练掌握并在项目中成功使用的工具如spdlog,nlohmann/json。试验 (Trial):正在小范围或非核心项目中尝试前景看好的工具如Drogon用于新 API 项目。评估 (Assess):从集锦或社区了解到值得花时间研究其适用性的工具如taskflow用于重构旧有计算模块。暂缓 (Hold):暂时不推荐使用可能是过时、有已知缺陷或与团队技术栈不匹配的工具。定期如每季度回顾和更新这个雷达。关注集锦源项目的更新订阅一些优秀的 C 博客如C Weekly,Bartek’s coding blog或 GitHub 趋势榜保持对生态的敏感度。4.2 深度参与从使用到贡献当你对一个工具库用得得心应手后可以尝试更深入地参与阅读源码选择一两个你依赖的核心库比如fmt的格式化机制spdlog的异步队列实现深入阅读其源码。这是提升对现代 C 模板、并发、内存模型理解的绝佳途径。排查问题在使用中遇到问题时先尝试自己通过阅读源码和文档来定位。如果能找到原因甚至修复方案你的理解会达到一个新的层次。贡献代码从修复文档错别字、补充示例代码开始逐步到提交 Bug Fix 或小型功能。开源贡献是证明你能力、连接社区的最有效方式。分享经验将你在集成、使用、踩坑过程中的经验总结成博客或内部文档。教是最好的学分享能迫使你理清思路深化理解。4.3 应对常见陷阱与挑战即便有了优秀的工具集在实际项目中依然会面临挑战陷阱一版本依赖与冲突你的项目依赖库A要求fmt版本 7.0而库B要求fmt版本 6.0。这就是典型的依赖冲突。解决方案使用现代的依赖管理工具如Conan或vcpkg。它们能更好地处理传递依赖和版本解析。在CMake中确保使用add_subdirectory或FetchContent时同一依赖只引入一次。陷阱二ABI 兼容性问题在 Linux 下使用不同版本的 GCC 或不同编译选项如-stdc11vs-stdc17编译的库可能无法链接在一起。解决方案统一项目的编译工具链和标准。在团队内和 CI 环境中强制使用相同版本的编译器如 GCC 10.2和一致的编译标志。对于第三方预编译库尽量自己从源码编译或者使用提供 ABI 稳定承诺的版本如某些库的-abi-version。陷阱三过度设计与“杀鸡用牛刀”看到集锦里琳琅满目的强大框架很容易产生“技术镀金”的冲动为一个简单的内部工具引入一个庞大的全栈框架。解决方案保持简单 (KISS原则)。根据项目实际规模和生命周期选择技术。一个只需要解析配置文件的脚本用inih就足够了没必要上nlohmann/json。一个简单的网络服务用Crow可能比用Drogon更合适。陷阱四忽视内存与性能分析集锦中的工具帮你快速实现功能但性能瓶颈和内存泄漏仍需自己把控。解决方案将性能分析工具集成到开发流程中。学习使用Valgrind特别是Memcheck和Callgrind、gperftoolsCPU Profiler、heaptrack等。在关键代码上线前进行基准测试和压力测试。5. 从工具使用者到架构思考者最终这个“一站式现代 C 项目开源工具集锦”带给你的不应只是一堆可复制的代码片段而是一种选型思维和架构意识。你会开始思考为什么spdlog的异步模型采用多生产者单消费者队列nlohmann/json的模板魔术是如何实现如此灵活的接口的RocksDB的 LSM-Tree 结构与其高性能写入之间的关系是什么在面对一个具体业务场景时是选择单体应用配合多个轻量库还是直接采用一个全功能的框架通过持续地使用、学习和思考这些优秀的开源项目你不仅能提升解决具体问题的效率更能潜移默化地吸收其中蕴含的软件设计思想、性能优化技巧和工程最佳实践。这份集锦就像一位无声的导师为你打开了现代 C 生态的宝库大门而门后的道路如何走能探索到多深的境界则完全取决于你个人的实践与思考。记住最好的工具永远是那个能恰到好处地解决你当前问题并且能让你的代码库保持清晰、可维护的工具。

相关新闻

Unity 2D物理触发器深度解析:从原理到实战应用

Unity 2D物理触发器深度解析:从原理到实战应用

1. 项目概述在Unity 2D游戏开发里,BoxCollider2D组件上的那个小小的Is Trigger复选框,绝对是新手和老手都绕不开,但又常常让人心里犯嘀咕的一个存在。你可能用它做过简单的开关门、拾取金币,也可能在更复杂的物理交互里被它“坑”…

2026/10/18 5:50:13 阅读更多 →
从张柏芝机场照看技术工具的情绪价值:如何构建带来掌控感的工作流

从张柏芝机场照看技术工具的情绪价值:如何构建带来掌控感的工作流

那天在机场,张柏芝被拍到独自一人,身边没有助理,自己推着行李车,神情平静。这张照片在网上流传开后,很多人说“戳中了内心”。一个看似普通的明星机场照,为什么能引发如此广泛的共鸣?这背后&…

2026/10/17 17:52:25 阅读更多 →
Flutter+OpenHarmony构建高校新生报到系统实践

Flutter+OpenHarmony构建高校新生报到系统实践

1. 项目背景与核心需求高校新生报到管理系统是每年开学季高校信息化建设的重点工程。传统方案往往面临以下痛点:多平台适配成本高(需分别开发Android/iOS/Web版本)、高峰期系统稳定性不足、现场网络条件差导致数据同步困难。我们采用FlutterO…

2026/10/14 14:32:31 阅读更多 →

最新新闻

Git仓库本地化:从镜像克隆到自建服务的完整迁移指南

Git仓库本地化:从镜像克隆到自建服务的完整迁移指南

在公共代码托管平台嫖了这么多年仓库,很多开发团队都会遇到这样一个不能再熟悉的场景:项目越来越重要,团队规模变大,合规要求收紧,或者你所在的内网环境根本连不到外网,这时候“git仓库本地化”就成了绕不开…

2026/10/19 16:40:18 阅读更多 →
Git仓库本地化全指南:从迁移方案到备份恢复的完整实践

Git仓库本地化全指南:从迁移方案到备份恢复的完整实践

最近团队在做一个不大不小的基建调整:把散落在外部托管平台上的代码仓库,全部收回到内网服务器,做一次彻底的仓库本地化。折腾了一周多,踩了不少坑,也沉淀出一套可以照抄的流程。这篇就围绕 git 仓库本地化&#xff0c…

2026/10/19 16:40:18 阅读更多 →
UDP socket通讯从原理到实战:避开丢包与缓冲区陷阱

UDP socket通讯从原理到实战:避开丢包与缓冲区陷阱

做网络通讯的同学应该都有过这种体验:项目整体设计里定好了UDP通讯,但到了socket层实现时,最不起眼的细节反而浪费最多时间。socket之UDP通讯这个主题看着基础,实践起来却能带出一串问题——无连接、数据报边界、MTU、缓冲区、端口…

2026/10/19 16:40:18 阅读更多 →
用代码自动生成电影预告片:从场景检测到音频卡点的工程实践

用代码自动生成电影预告片:从场景检测到音频卡点的工程实践

我最初接触“用代码生成电影预告片”这个想法,是在一次项目交付周期被压缩到几乎不合理的极限时。当你的手头堆着几十段零碎的素材,需要在几个小时内剪出一版节奏够快、情绪能立起来的预告片,传统剪辑软件里的逐帧精修操作,就会变…

2026/10/19 16:40:18 阅读更多 →
基于Java的全屋家具定制信息管理系统设计与开题答辩指南

基于Java的全屋家具定制信息管理系统设计与开题答辩指南

最近帮学生准备毕业设计的开题答辩,正好碰到一个很有代表性的题目:基于Java的全屋家具定制信息管理系统设计。这个题目听起来很常规,但真正能把开题报告讲清楚、扛住答辩老师连环追问的人并不多。很多时候问题不是代码写不出来,而…

2026/10/19 16:40:18 阅读更多 →
用元空AI Claw实现公众号每天自动生成10篇文章的完整教程

用元空AI Claw实现公众号每天自动生成10篇文章的完整教程

1. 先想清楚:这10篇到底是给谁看的“每天自动给你10篇公众号文章”,听起来像是只要把工具挂上,早上打开手机就有现成的稿子等着发。但实际上,我最早自己做这套自动化的时候,第一个动作不是去拉接口,而是先停…

2026/10/19 16:38:59 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 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/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 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/19 2:54:50 阅读更多 →
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/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →