量化交易框架WonderTrader依赖库编译避坑指南

简介:这是为 Ubuntu 22.04 与 gcc 11.4 环境预编译的 WonderTrader 依赖库,面向需要在本地编译量化交易框架的 C++ 开发者。资源将官方默认依赖路径 /home/mydeps 改为通过环境变量 MyDependsGcc 指向自定义目录 /deps/wtcpp,并同步修改 CMakeLists.txt,可避免因固定路径不一致导致的构建失败。压缩包共含 2000 个文件,其中 1856 个 hpp 头文件、144 个 h 头文件,覆盖 schema、document、format、core、reader、pointer、chrono、pattern_formatter、encodings 等常用模块,整体仅 14.5MB,轻量易用。目前已有 238 人学习,适合需要快速搭建 WonderTrader 依赖环境的开发者,解压后配置好环境变量即可接入现有工程,省去逐项编译依赖的繁琐过程,同时保留清晰的 CMake 修改点便于二次定制。

1. WonderTrader 依赖库:为什么编译它比写策略还容易劝退人

新拿到一台干净的服务器,装好系统、拉下 WonderTrader 源码,满怀期待地敲下编译命令,然后被一堆 Boost、TinyXML、OpenSSL 的报错砸到怀疑人生——这是几乎每个接触这个 C++ 量化交易框架的人都会遇到的第一道坎。WonderTrader 本身是模块化设计,核心代码并不复杂,真正让新手栽跟头的,恰恰是它背后那一组依赖库:版本对不对、编译选项是否一致、静态还是动态、Release 还是 Debug,任何一个环节错位,连 demo 都跑不起来。这篇文章不是来复述官方文档的,而是从一线编译部署的角度,把 WonderTrader 依赖库这堆事拆开讲清楚:每个库是干什么的、必须装到什么程度、编译参数怎么设、失败时看哪里。无论你是要用它跑回测、做实盘,还是想二开改造,先跨过依赖库这道坎,后面才谈得上策略。

2. 拆解 WonderTrader 的依赖清单:每个库解决什么问题,缺了会怎样

2.1 Boost Beast:WonderTrader 网络通信的骨架

WonderTrader 的行情接入和交易报单,底层走的是 WebSocket 协议。C++ 生态里做 WebSocket 客户端最省事的库就是 Boost.Beast,它属于 Boost 体系的一员,代码质量高、对 OpenSSL 的集成也好,所以 WonderTrader 选择它做网络层并不意外。

很多人对 Boost 的印象还停留在"header-only、直接 include 就能用",这其实是个误区。Beast 虽然大部分是头文件实现,但它依赖 Boost.Asio,而 Asio 在较老版本里需要单独编译 boost_system(新版本 1.69 之后 Asio 大幅简化,但编译期仍然要处理宏定义和链接选项)。更关键的是,WonderTrader 用 Boost 的地方不止 Beast 一处,还有 Boost.Filesystem 用于路径处理、Boost.PropertyTree 用于部分配置读取,这几个是实实在在需要链接的库。

我在实际编译时见过的典型错误有两种。第一种是fatal error: boost/beast.hpp: No such file or directory,这说明 Boost 头文件路径没加进编译器的 include 搜索路径;第二种是链接阶段报一堆undefined reference to boost::filesystem::...,这明显是没有链接 boost_filesystem 库。前者是路径配置问题,后者是链接参数问题,解决方向完全不同。

我一般会在编译参数里显式加上:

-DBOOST_ALL_NO_LIB -DBOOST_DATE_TIME_NO_LIB

这两个宏的作用是告诉 Boost 不要自动去匹配libboost_*.lib这类带编译选项后缀的库名,避免 Debug/Release 混用或者运行时库不一致导致的链接错乱。在 Linux 下,如果系统已经装了 Boost,我需要确认版本号,然后用-lboost_filesystem -lboost_system显式链接。

2.2 TinyXML 与配置文件体系:从 XML 到交易参数的路径

WonderTrader 的配置体系走的是 XML 路线:config.xml定义仓储和路径,traders.xml定义交易柜台参数,策略的 JSON 配置又是另一层。XML 解析这部分,框架没有引入重量级的 Xerces 或 libxml2,而是选用 TinyXML 系列。

TinyXML 分两个版本:老版 TinyXML 和新版 TinyXML2。WonderTrader 用的主要是 TinyXML2,原因很简单:API 简洁、无额外依赖、解析速度快,对一个需要逐毫秒读行情配置的框架来说足够轻。但我发现很多人在手动搭建依赖时,会把 TinyXML 的老版本下载下来,结果接口对不上,编出一堆废弃函数警告。

装 TinyXML2 时,坑点藏在编译选项上。默认编译出的动态库是libtinyxml2.so,但如果你在 CMake 里开启了TINYXML2_SHARED,Windows 下要注意 DLL 的运行时依赖。更隐蔽的问题是字符集:WonderTrader 的配置文件里有中文字段(比如柜台名称、合约中文名),TinyXML2 默认按 UTF-8 解析,如果文件是 GBK 编码,解析出来全是乱码,策略加载时看起不到作用。

我自己的处理习惯是:所有 XML 配置统一存成 UTF-8 无 BOM 格式,用 VS Code 或 notepad++ 转码后再扔进项目目录。这个习惯看着小,但能在排错阶段省下大量时间。

2.3 可选依赖的取舍:MySQL、OpenSSL、ZLib 装到什么程度

WonderTrader 的依赖不是铁板一块,它分核心依赖和按需依赖。核心依赖是 Boost 和 TinyXML2,这两者缺了整个框架都编不过。按需依赖则包括:MySQL 客户端库(用于行情和交易数据的落库)、OpenSSL(用于 WSS 加密连接)、ZLib(用于数据压缩,尤其是 K 线历史数据的解压)。

很多初次接触的人把这三个全装上,结果在墙上撞得头破血流。我一般建议先按最小集编译:不装 MySQL,跳过 ZLib,OpenSSL 看有没有实盘需求再决定。这样做的好处是,第一轮编译排错时变量少,问题定位快。等框架能跑起来、回放出数据了,再回头补装可选依赖也不迟。

但有个细节值得注意:WonderTrader 的 CMake 里探测依赖用的是find_package,如果你机器上恰好装了某些库的残留文件,CMake 可能会误判依赖齐全,最后在实际链接时报错,这种情况在手动安装过多个版本依赖的开发机上特别常见。我一般会在编译前先检查 CMakeCache 里的依赖路径,确认不是误探测之后再继续。

3. 在 Linux 上编译 WonderTrader 依赖库:从空白系统到跑通 Demo

3.1 从零开始:装基础工具链和系统库

Linux 下编译 WonderTrader 最顺手的发行版是 Ubuntu/Debian 系,包管理器直接能装到大部分依赖,不用手动造轮子。要注意的是,WonderTrader 需要 C++17 编译器支持,GCC 7.3 以上是底线,建议直接用 GCC 9 或更高版本,否则处理一些模板代码时会遇到编译错误,这些错误和你写的代码无关,纯粹是编译器版本不够新。

装依赖的命令大致是:

sudo apt-get update sudo apt-get install -y build-essential cmake git # Boost 开发库,版本随意,但不能缺头文件 sudo apt-get install -y libboost-all-dev # TinyXML2 开发库 sudo apt-get install -y libtinyxml2-dev # 可选:按需装 OpenSSL sudo apt-get install -y libssl-dev # 可选:MySQL 客户端库 sudo apt-get install -y libmysqlclient-dev

装完后,我习惯先验证两个关键头文件的存在:/usr/include/boost/beast.hpp和/usr/include/tinyxml2/tinyxml2.h。如果头文件在,说明开发包装好了;如果只有运行库,没有头文件,编译时照样会报No such file or directory——这种问题不少见,尤其容易出现在用apt-get install只装了运行时库而没有装-dev包的时候。

3.2 编译脚本的写法和关键参数

拿到 WonderTrader 源码后,推荐的做法是先单独编译依赖库,再编译主项目。如果手头没有现成的依赖编译脚本,我会按下面的方式组织:

# 从源码编译 Boost 的场景比较少,系统包够用 # 重点看 CMake 配置阶段的关键参数 cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -DBUILD_SHARED_LIBS=OFF \ -DCMAKE_INSTALL_PREFIX=/opt/wondertrader/deps \ -DBOOST_ROOT=/usr \ -DTINYXML2_INCLUDE_DIR=/usr/include/tinyxml2 \ -DOPENSSL_ROOT_DIR=/usr/local/ssl \ -DUSE_MYSQL=OFF \ -DUSE_ZLIB=OFF

其中BUILD_SHARED_LIBS=OFF是我个人偏好的静态链接方案:把所有依赖库编成静态库,然后链接进 WonderTrader 的主程序,部署时不需要在目标机器上一个个装依赖。代价是生成的可执行文件体积偏大、链接时若有重复符号容易炸,但省去了运行时"缺 .so"的烦恼。USE_MYSQL=OFF和USE_ZLIB=OFF是第一次跑通时的保守选择,等确认基础链路没问题后再开。

CMake 执行完之后,紧接着就是编译,我一般先看配置阶段的输出有没有Could NOT find行。如果有,不要急着 make,先解决依赖探测问题再继续,否则 make 到一半才发现头文件缺失,排查路径会拉得很长。

3.3 链接期报错的三个常见定位手段

依赖库都装齐、编译也通过,不代表万事大吉——链接期才是排错主战场。我遇到的链接报错有三种典型表现,对应的排查手段也不同。

第一种是undefined reference to boost::filesystem::path::...,这类报错十有八九是没链接对应库。解决办法是在 CMakeLists 或命令行里检查是否漏了-lboost_filesystem。第二种是multiple definition of ...,这通常是把同一个静态库重复链接了,或者 Debug 和 Release 的库混用了,去掉其中一个就能解决。第三种是找不到-ltinyxml2,这多半是库的搜索路径没配置对,用-L/usr/lib/x86_64-linux-gnu指定一下即可。

排查工具方面,我可以明确地推荐这几个:nm查看符号表、ldd查看运行时动态库依赖、ld --verbose查看链接器搜索路径。这三个工具能覆盖九成以上的链接问题。我通常会先跑一次ldd看可执行文件的依赖是否齐全,如果依赖都齐还报链接错误,再回头用nm -C查符号是否落在对应的.a文件里。

4. 依赖库避坑指南:版本混用、链接顺序、运行期缺库

4.1 现象:Boost 版本不一致导致 WebSocket 握手失败

某项目开发者 A 在本地编译 WonderTrader 一切正常,但把编译好的可执行程序复制到另一台服务器上后,程序能启动,但连接行情服务器时总是握手失败,日志里报WebSocket upgrade failed。

排查后发现,他那台服务器系统自带的 Boost 是 1.65 版本,而本地编译时用的是 1.74。虽然程序是通过静态链接编译的,但 Boost.Asio 内部的某些实现细节和 OpenSSL 的交互方式在版本间有差异,导致行为不一致。解决方法是:将编译机器的 Boost 版本和运行机器的 Boost 版本统一到同一个大版本,或者在部署文档里明确标注依赖版本要求。

4.2 现象:Debug 库和 Release 库混用,跑起来就崩

这是我最常被问到的问题之一。现象是程序在开发机上用 Debug 配置编译运行正常,切到 Release 配置后,读取行情数据时崩溃;或者反过来:Release 全正常,Debug 跑两步就断。

原因:WonderTrader 依赖库里有部分库编的是 Debug 版本,另一部分编的是 Release 版本。Debug 和 Release 的运行时堆管理机制不同,内存块在 debug 模式下带保护字节,Release 模式下释放方式不一样,混在一起必然出问题。解决方法是把全部依赖库统一配置,不要用混合配置。

4.3 现象:换台机器部署,运行报找不到 libtinyxml2.so

这是 Linux 部署中最经典的坑。程序在编译机上跑得好好的,一到生产服务器就报error while loading shared libraries: libtinyxml2.so.9: cannot open shared object file。

原因:编译时链接的是动态库,运行时需要 ld.so 找到这个库文件。如果编译机器的库路径和生产机器不一致,或者生产机器根本没有安装这个包,就会崩。解决方式有两种:一是把 TinyXML2 也编译成静态库链接进去,一劳永逸;二是在程序启动前设置export LD_LIBRARY_PATH=/path/to/libs:$LD_LIBRARY_PATH。我个人更推荐第一种,毕竟运维环境不可控,静态链接是量化交易系统抗环境变化的重要手段。

4.4 现象:配置文件里路径写错,依赖库 "全装好了" 也启动失败

这类问题最让人哭笑不得:依赖库里有什么装什么,全装齐了,但一下午排查时间花在了路径拼写上。现象是启动 WonderTrader 时报Can not open config file: config.xml,但明明文件就在当前目录。

原因:WonderTrader 的程序运行时的当前工作目录(cwd)决定了配置文件的搜索路径。如果直接用./WtRunner启动,cwd 是当前目录,没问题;但如果通过 systemd 服务或计划任务启动,cwd 可能被改成了根目录或 home 目录,配置文件自然找不到。解决方法是:在工作脚本里先cd到程序所在目录,再执行启动命令。这个坑和依赖库本身关系不大,但非常容易和依赖库问题混淆,浪费大量时间。

4.5 现象:MySQL 相关的编译不过,问题其实不在 MySQL

某次在某公司的模拟项目 X 环境中,需要把 WonderTrader 的行情数据写入 MySQL。把USE_MYSQL=ON打开后,编译报错,报错信息全指向 MySQL 头文件缺失。大家下意识认为是 MySQL 客户端库没装好,结果翻来覆去排查发现,真正的问题是 CMake 没有找到 OpenSSL 的库文件,而 MySQL 驱动编译时强依赖 OpenSSL 头文件。

这个坑的关键在于:依赖依赖之间还有传递依赖。解决方法是先确保 OpenSSL 安装完整(libssl-dev装好),再编译 MySQL 相关模块。如果不确定当前哪个依赖缺失,可以用cmake -LA查看缓存变量里的探测结果,逐项确认。

5. 依赖库就绪后的第一轮验证:从 Demo 回放到自定义单元测试

依赖编译完、框架能启动,等于是从"能不能编出来"迈入了"跑得对不对"的阶段。我会先做三件事:跑自带的回放 demo、检查依赖库的链接状态、写最小单元测试验证关键逻辑。

第一件事是回放 demo。WonderTrader 的发布包里通常带一个WtBtRunner配置样本和一段历史数据,启动后能看到数据回放进度和收益率曲线,这是验证依赖库是否完整的入口。如果回放能正常出结果,说明 Boost 网络栈工作正常、配置文件解析正确、核心算法模块没有因为依赖问题被破坏。

第二件事是依赖库的完整性检查。我习惯在部署目录下留一份依赖清单,标明每个依赖的版本和编译日期,并写一个脚本定期检查:

ldd WtBtRunner | grep "not found"

如果输出为空,说明动态库依赖完整;如果有not found,脚本直接滚出提示。这个习惯在团队协作时特别有用,新人拿到部署包时一眼就能确认运行环境是否合格。

第三件事是写最小单元测试。依赖库装好了,我可以针对配置文件解析写一个独立的测试模块:

#include "tinyxml2/tinyxml2.h" #include <cassert> int main() { tinyxml2::XMLDocument doc; auto err = doc.LoadFile("config.xml"); assert(err == tinyxml2::XML_SUCCESS); auto root = doc.RootElement(); auto path = root->FirstChildElement("datapath"); assert(path != nullptr); assert(std::string(path->GetText()).size() > 0); return 0; }

这个测试不用跑策略,只要它能通过,就说明 TinyXML2 的依赖路径、编码设置、配置读取链路是干净的。等到后续接入行情时再验证 Boost 网络栈,出问题也更容易定位。

我在实际工作中还养成一个习惯:每次编译 WonderTrader 之前,先记录当前系统环境快照,包括 Boost 版本、GCC 版本、OpenSSL 版本。这些信息看着琐碎,但在后来翻车排查时,往往是定位问题的第一线索。环境快照配合上面的验证脚本,基本能把依赖库问题的排查时间压缩到半小时以内。希望这些经验能帮你在 WonderTrader 面前少走几趟弯路。

本文还有配套的精品资源,点击获取

相关新闻

LFM2.5-24B-A2B完全解读:24B MoE推理大模型为何只激活2B参数就能跑本地Agent

LFM2.5-24B-A2B完全解读:24B MoE推理大模型为何只激活2B参数就能跑本地Agent

大模型基础模型推理模型本地部署模型量化 【免费下载链接】LFM2.5-24B-A2B-GGUF 项目地址&#xff1a; https://ai.gitcode.com/hf_mirrors/unsloth/LFM2.5-24B-A2B-GGUF 点击查看 免费下载 LFM2.5-24B-A2B-GGUF 是 Liquid AI 开源的 24B MoE 推理大模型的 GGUF 量化仓库&…

2026/10/20 5:53:19 阅读更多 →
ASP+SQL旅游管理系统部署避坑指南:从IIS配置到数据库还原

ASP+SQL旅游管理系统部署避坑指南:从IIS配置到数据库还原

简介&#xff1a;这套ASPSQL旅游管理系统设计资料面向计算机相关专业毕业生、Web开发初学者及需要完成课程设计的人群&#xff0c;覆盖用户管理、旅游线路展示、在线预订、后台管理、安全性与性能优化等核心模块&#xff0c;可帮助理解ASP动态页面与SQL Server数据库的协同开发…

2026/10/20 5:52:19 阅读更多 →
从零构建artcraft:代码生成视觉内容的架构设计与实战

从零构建artcraft:代码生成视觉内容的架构设计与实战

1. 从“artcraft”这个名字说起&#xff1a;它到底想解决什么问题第一次看到“artcraft”这个标题&#xff0c;我脑子里蹦出来的第一反应是“艺术”加“手艺”&#xff0c;一个把创意和动手能力揉在一起的东西。后来跟几个做独立开发的朋友聊&#xff0c;发现大家对这个词的理解…

2026/10/20 5:52:19 阅读更多 →

最新新闻

STM32 bxCAN实战:从物理层到过滤器配置与调试排障

STM32 bxCAN实战:从物理层到过滤器配置与调试排障

做嵌入式这几年&#xff0c;UART、I2C、SPI都是老朋友&#xff0c;但真正让我觉得“像个通信工程师”的&#xff0c;是开始啃STM32的CAN外设之后。原因很简单&#xff1a;在汽车、机器人和工业现场&#xff0c;CAN总线是默认的“老大哥”&#xff0c;而它在微控制器上的硬件实现…

2026/10/20 6:26:33 阅读更多 →
ReST-MCTS精读:用蒙特卡洛树搜索与过程奖励实现LLM自我训练

ReST-MCTS精读:用蒙特卡洛树搜索与过程奖励实现LLM自我训练

这篇是论文精读系列的第九期。选题的时候我特意挑了一个既讲方法、又讲工程的文章&#xff1a;ReST-MCTS&#xff0c;标题直译过来就是“基于过程奖励引导的树搜索做LLM自我训练”。一句话概括它的核心思想&#xff1a;让大模型不要只想着“快答”&#xff0c;而是像下棋一样&a…

2026/10/20 6:26:33 阅读更多 →
实测,ToClaw为什么是最优秀的OpenClaw龙虾:从 ToDesk 远程到 TaoToken 统一 Key 的配置复盘

实测,ToClaw为什么是最优秀的OpenClaw龙虾:从 ToDesk 远程到 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 6:26:33 阅读更多 →
diagram-design:从图形类型到布局配色的技术图设计指南

diagram-design:从图形类型到布局配色的技术图设计指南

1. 从"diagram-design"这个标题说起&#xff1a;它到底在解决什么问题第一次看到"diagram-design"这个标题&#xff0c;我脑子里冒出来的第一个念头是&#xff1a;这大概率不是一个单纯的"画图工具"&#xff0c;而是一套关于"如何把复杂信息…

2026/10/20 6:26:33 阅读更多 →
CTF Misc入门:DOCX隐写与ZIP伪加密的底层原理及010 Editor实操

CTF Misc入门:DOCX隐写与ZIP伪加密的底层原理及010 Editor实操

CTF新手村常客——Misc题型里的DOCX隐写和伪加密&#xff0c;对很多刚入坑的朋友来说&#xff0c;看WriteUp觉得挺简单&#xff0c;真上手时又容易卡壳。我最初玩PolarCTF这类靶场时也是这样&#xff0c;面对一个打不开的docx文件&#xff0c;第一反应是直接改后缀名丢进解压工…

2026/10/20 6:26:33 阅读更多 →
HTTP POST表单提交全解析:Content-Type、编码格式与实战避坑指南

HTTP POST表单提交全解析:Content-Type、编码格式与实战避坑指南

1. 从一个被忽略的细节说起&#xff1a;为什么表单提交远不止填个action很多人第一次接触Web开发&#xff0c;接触到的第一个"能跑起来"的功能&#xff0c;大概率就是一个HTML表单。写一个<form>标签&#xff0c;配上action和method"post"&#xff0…

2026/10/20 6:25:32 阅读更多 →

日新闻

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实现详解

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

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

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

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

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

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

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在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/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 阅读更多 →