libArcus跨平台编译指南:CMake配置、依赖管理与常见报错排查
如果你准备在 3D 打印切片系统里做前后端分离或者想在自己的桌面软件里复用一套基于消息的通信层迟早会碰到 libArcus。它不是一个能独立运行的软件而是一个 C 动态库/静态库上层界面把请求封装成消息下层引擎处理完再回传中间这一整段序列化、发送、接收、解析的工作都由 libArcus 兜着。这篇文章不打算贴官方文档而是从实际编译者的角度把下载、依赖、CMake 配置、Linux 和 Windows 两条构建路径、常见报错和处理方法完整过一遍适合刚开始接触这个库或者换过环境之后需要重新编译的人。1. libArcus到底是什么先别急着下源码1.1 它在项目里的角色libArcus 的核心定位是通信中间件。这里说的通信不是普通的 HTTP 请求而是两个进程之间持续的、低延迟的消息交换。它最典型的应用场景是一个前端界面程序负责渲染参数和显示进度一个后端计算程序负责处理实际任务。前端每点一次按钮就会生成一个描述参数的 protobuf 结构体通过 ZeroMQ 连接发送到后端后端处理完再回传结果。整个过程中libArcus 扮演的是一根双向管道同时也承担了消息的编解码。正因为这个定位libArcus 本身的代码量其实不大。它的难点从来不在 C 语法而在它脚下垫着两个非常常见的开源基础库Protocol Buffers 和 ZeroMQ。前者负责把结构化的对象压成紧凑的字节流后者负责把这串字节流可靠地送到接收方。很多编译问题其实都是这两个底座带来的。1.2 为什么说依赖比库本身更值得关注拿生活中的快递做类比Protocol Buffers 是快递单的标准格式规定姓名、地址、电话分别填在哪里ZeroMQ 是快递运输网决定包裹走陆运还是空运、什么时候到。libArcus 相当于一个打包员它自己不懂怎么开货车但知道怎么按快递单格式把包裹交给运输网。所以你想编译 libArcus必须先确保快递单标准protobuf 编译器和运输网ZeroMQ 开发库都装好了。很多人在初次编译时喜欢直接 clone 源码然后立刻 cmake结果第一阶段就报找不到头文件。这不算意外因为 libArcus 的 CMake 脚本只负责搜寻和链接依赖并不会帮你安装它们。它把该调用的工具链都写清楚了但工具链本身得由你自己准备。1.3 编译产物和使用形态编完以后会得到什么通常包括libArcus 本身的动态库Linux 下是 libArcus.soWindows 下是 Arcus.dll一堆从 .proto 文件生成的消息定义头文件以及供外部项目引用的 CMake 配置文件。如果开启了 Python 绑定开关还会多出一个 Python 扩展模块让你能在脚本里直接使用同样的通信层。明白这一点对后面的验证很重要安装完成后你不仅要有库文件还要有能在一个新 C 工程里通过find_package(Arcus)找到的配置文件。很多人把 .so 或 .dll 拿到手就以为成功了其实 CMake 配置文件没装好的话下一个项目编译时照样找不到它。2. 下载源码之前先把版本和依赖关系锁死2.1 从哪拿源码最省事我的建议是优先从代码托管平台的发布页下载对应版本的源码压缩包而不是直接 clone 主分支。原因很简单主分支是开发态依赖和代码变化频繁可能今天能编过明天就报错。发布页的 tag 对应的是一套经过验证的状态至少在你下载的时候它和某个版本号是绑定的。如果你确实想用 git 管理也建议 checkout 到具体的 tag。流程是先 clone 仓库地址然后git checkout到目标版本。实际项目里我通常会先确定自己依赖的 libArcus 功能再根据功能需求选择版本而不是无脑选最新版。历史版本之间在 API 和依赖要求上是有差别的越新不代表越适合你。2.2 子模块与配套仓库千万别漏libArcus 这一类仓库通常会把一部分第三方定义或接口定义放在子模块里。如果你下载的是源码压缩包子模块目录往往可能是空的。解决办法是在仓库根目录执行git submodule update --init --recursive如果你是从发布页下载的 zip同样需要在目录里执行这条命令前提是仓库目录本身关联了远程源。这个步骤看起来简单漏掉之后的现象却非常诡异。configure 阶段一切正常编译到一半突然找不到某个头文件而且那个头文件看起来不应该由 libArcus 自己提供。你反复检查依赖都没发现问题最后才发现是子模块没拉。所以我把这条写在前头先拉子模块再跑 CMake。2.3 protoc 和 libprotobuf 的版本必须同源同代Protocol Buffers 的产物比较特殊你用某个版本的 protoc 编译器从 .proto 文件生成 C 代码这段代码运行时需要链接对应版本的 libprotobuf。两个版本可以不完全一样但必须在同一个大版本内最好保持一致。体现在编译阶段错误往往不会直接提示“版本不对”而是报头文件冲突体现在运行阶段则可能在启动时抛出断言。最坑的是你的系统里可能同时存在自编译的 protobuf 和系统自带的 protobufCMake 找到哪一套完全看变量怎么设。所以在下载 libArcus 之前我建议先记录三件事要编译的 libArcus 版本、系统里 protoc 的版本、链接库 libprotobuf 的版本。处理好这三者的关系后续能省掉一大半编译问题。3. Linux 下从零编译每一步都拆开来解释3.1 先装依赖再谈编译以常见的 Linux 开发机为例包管理器命令大致是这样不同发行版换成自己的包管理器即可sudo apt-get update sudo apt-get install -y build-essential cmake git \ libprotobuf-dev protobuf-compiler \ libzmq3-dev python3-dev简单说明每一行是干什么的libprotobuf-dev 提供 protobuf 的运行时库和头文件protobuf-compiler 提供 protoc 命令两者通常是分开的包。很多人只装了前者没装后者是因为开发包只在编译时用到而 protoc 是一个独立命令行工具需要单独装。libzmq3-dev 提供 ZeroMQ 的开发头文件和库。python3-dev 只有在你想生成 Python 绑定时才需要不需要就省略它。装完之后先验证一下protoc --version cmake --version如果 protoc 没有输出先别往下走否则 configure 阶段一定会报找不到 protobuf。3.2 CMake 配置、构建和安装依赖就位后编译本身只有三步cmake -S . -B build -DCMAKE_BUILD_TYPERelease -DCMAKE_INSTALL_PREFIX$HOME/third_party/arcus cmake --build build -j$(nproc) cmake --install build第一行是 configure。-DCMAKE_INSTALL_PREFIX指定安装目录。不建议直接填/usr/local除非你是要给整个系统多用户使用。个人开发的时候放到$HOME/third_party/arcus这类独立目录更好看文件、卸载、升级都方便。第二行是构建-j后面的数字是并行任务数$(nproc)会自动取 CPU 核数内存不够时可以手动改成 2 或 4。第三行是安装把所有头文件、库和 CMake 配置复制到安装目录。如果你只是想在本地临时编一下不安装也可以编译产物会留在 build 目录里。但后续项目要引用 libArcus就绕不开 install。3.3 编译选项的取舍关掉不用的功能libArcus 的 CMake 并不是默认打开所有功能。常见可选项包括测试、示例和 Python 绑定。测试如果不需要在 configure 时加上-DBUILD_TESTINGOFF能省下不少编译时间。Python 绑定是很多人的噩梦如果你只想用 C 层先关掉-DBUILD_PYTHONOFF如果确实需要 Python 绑定这一行不要加但 Python 开发头文件必须提前装好。不同版本的开关名可能略有差异。最稳妥的办法是在源码目录里执行cmake -S . -B build -L这个命令会列出 CMake 认识的全部缓存变量。你可以搜PYTHON、TEST、EXAMPLE等关键字然后按需设置。不要盲目复制网上旧版本的命令项目版本一换开关名可能就变了。3.4 安装后其他项目怎么找到它安装完成后检查安装目录的lib和share/cmake这两个子目录。你大概率会看到类似这样的结构lib/libArcus.so lib/cmake/Arcus/ArcusConfig.cmake include/Arcus/...这个ArcusConfig.cmake就是我们说的 CMake 配置文件。以后在另一个 C 工程里只要通过CMAKE_PREFIX_PATH指向这个安装目录就能find_package(Arcus)。这比你手工指定头文件路径和库文件路径可靠得多因为所有目标定义和依赖关系都由配置脚本替你处理好了。4. Windows 下编译能少踩一个坑是一个4.1 依赖库准备是最大的坎Windows 上最缺的不是编译能力而是让 CMake 找到依赖。Protocol Buffers 和 ZeroMQ 在 Windows 上不像 Linux 那样由系统统一管理你得先自己决定依赖从哪来。常见做法有三种用预编译包、用包管理器安装、自己从源码编译。新手优先用预编译包省时间老手更愿意自己编主要是为了统一运行时。不管哪种做法务必保证架构一致64 位工程配 64 位依赖32 位工程配 32 位依赖。混搭会在链接阶段报出一堆看不懂的符号错误。手动编译依赖时我习惯把它们都装到同一个根目录下比如D:/third_party/protobuf D:/third_party/zeromq然后通过 CMake 告诉 libArcus。CMake 提供了一个通用入口-DCMAKE_PREFIX_PATHD:/third_party/protobuf;D:/third_party/zeromq这个变量会引导find_package在自定义目录里找 cmake 配置比逐个设置*_DIR更不容易写错。4.2 用 CMake 生成工程文件在 Windows 上我推荐用 CMake 配合本机编译器生成器。简单一点的做法是打开“x64 Native Tools 命令提示符”然后执行cmake -S . -B build -A x64 -DCMAKE_PREFIX_PATHD:/third_party/protobuf;D:/third_party/zeromq cmake --build build --config Release cmake --install build --config Release第一行用-A x64指定目标架构第二行按 Release 配置编译第三行把结果安装到默认目录。如果你希望安装到自定义位置第一行再加上-DCMAKE_INSTALL_PREFIXD:/third_party/arcus有些开发者喜欢用 Ninja 生成器这也可以但要确保命令行环境里存在本机编译器的环境变量。Ninja 本身不会帮你加载编译环境用集成开发环境自带的工程生成器反而更省事。第一次编译建议用集成开发环境的生成器少踩环境变量的坑。4.3 Debug/Release 混用和 DLL 的连锁反应Windows 构建里最经典的问题是运行时方式/MD和/MT的差异还有 Debug 和 Release 的差异。你编译 libArcus 时libArcus 本身是 Release依赖库也必须是 Release。如果某个依赖库是用 Debug 编译的链接器经常会报类似 LNK2038 的运行时不匹配错误。很多人 configure 正常、源码没问题反复重试才发现是依赖库配置配错了。另一个常见问题是运行时 DLL。在 Windows 上你的可执行文件不光要能找到 libArcus.dll还要能找到它依赖的 protobuf DLL 和 ZeroMQ DLL。最简单的做法是把这些 DLL 拷贝到 exe 同目录或者把它们所在目录加进 PATH。很多人在编译阶段一切顺利一运行就提示找不到 DLL十有八九是这一步没做。5. 编译报错排查把整条链路从头捋一遍5.1 先分阶段定位问题排错的第一件事是把问题归到 configure、build、link、runtime 这四个阶段。configure 阶段报错通常意味着依赖找不到build 阶段报错通常是生成代码或源码问题link 阶段报错基本是库路径、库顺序、ABI 不匹配runtime 报错则要回头检查 DLL 和 protobuf 版本。别把所有“编译失败”都当成同一类问题方向错了会浪费大量时间。我整理了一个简单的对照表供你快速判断阶段典型现象大概率原因configureCould NOT find Protobuf / ZeroMQ依赖未安装或路径未指定build找不到生成的头文件子模块未更新或 protoc 未执行linkunresolved external symbol架构混用、配置混用、库顺序不对runtime找不到 DLL / protobuf 断言DLL 未拷贝、protoc 与库版本不匹配5.2 依赖找不见时先检查缓存而不是重跑命令如果 configure 报Could NOT find Protobuf (missing: Protobuf_INCLUDE_DIR)先别急着反复执行 cmake。检查三处protoc 命令是否存在、protobuf 开发包是否安装、CMake 搜索路径是否正确。如果系统里存在多个 protobuf 版本用-DProtobuf_DIR或-DCMAKE_PREFIX_PATH指定目标版本所在目录。特别提醒如果你已经在一个 build 目录里 configure 过之后再安装新依赖CMake 缓存里可能还保留着旧的失败状态。正确做法是删掉 build 目录重建而不是继续往里面追加参数。5.3 protoc 版本错乱的现象protoc 版本和 libprotobuf 不匹配时会在生成代码的编译阶段看到一堆关于 old version / new version 的报错。这类问题看着像是源码不兼容其实根源往往是一致的系统中 protoc 可执行文件来自 A 包头文件来自 B 包库文件来自 C 包。解决办法是让 CMake 明确使用同一套 protobuf。先执行protoc --version再查一下头文件里对应的版本号确保两者对齐后再编译。不同版本混用导致的诡异错误在 libArcus 的编译问题里占比很高。5.4 ZeroMQ 路径不生效找不到 ZeroMQ 时同样可以通过ZeroMQ_DIR或CMAKE_PREFIX_PATH来指定。如果你不是用官方预编译安装而是自己从源码编译的务必把 include 和 lib 目录的层级摆对。CMake 期望的是一个包含 cmake 配置文件的目录而不是直接指向某个 .h 文件或 .lib 文件。5.5 链接错误的两板斧链接期出现unresolved external symbol或 LNK2038 时先按顺序检查三件事依赖库是 x64 还是 x86。Release/Debug 是否混用。第三方静态库是否按依赖顺序排列。在 Windows 下静态库顺序不像 Linux 下那么敏感但多个第三方库混在一起时依赖顺序仍然可能引起问题。如果你是用自编译的依赖库最好把 Debug 和 Release 版本的库分别输出到不同目录避免链接器拿错。5.6 Python 绑定模块参一脚如果 configure 阶段卡在 Python 相关检查而你自己并不需要 Python 绑定直接关掉对应开关是最快的解。如果确实需要往往是绑定生成工具链的问题而不是 libArcus 本身的问题。判断方法很简单把 Python 绑定开关关掉后 clean build如果问题消失说明根因在 Python 环境而不是库代码。你要做的是先补全 Python 开发包和绑定工具的依赖再回来编译。6. 验证不是看日志而是让别的工程真正链接一次6.1 安装目录里应该有这些产出物编完之后别只看日志里有没有 error。检查安装目录include/Arcus/下有核心头文件。lib/下存在 libArcus 动态库或静态库。share/cmake/Arcus/或lib/cmake/Arcus/下存在 CMake 配置文件。这三个东西缺一个下一个项目引用时就会遇到麻烦。尤其是 CMake 配置文件很多人会忽略导致安装完毕后外部工程根本找不到这个库。6.2 写一个最小验证工程新建一个目录放一个最简的 CMakeLists.txtcmake_minimum_required(VERSION 3.16) project(ArcusSmoke CXX) find_package(Arcus REQUIRED) add_executable(ArcusSmoke main.cpp) target_link_libraries(ArcusSmoke PRIVATE Arcus::Arcus)这里的Arcus::Arcus是常见的 CMake target 名称。如果你的版本导出的 target 名不同打开安装目录下的*Targets.cmake查一下用文件里的名字替换即可。配置时通过CMAKE_PREFIX_PATH指向 libArcus 的安装目录cmake -S . -B build -DCMAKE_PREFIX_PATH$HOME/third_party/arcus cmake --build build能顺利编译链接才说明库本身没白装。6.3 如果还想更放心跑一次消息回环最小链接验证通过后我建议再做一次真实的通信回环初始化一个客户端和一个服务端绑定到本地回环地址然后发送一条最简单的消息。这一步的意义是把 ZeroMQ 和 protobuf 两条链路都真正打通。具体 API 以当前版本的 example 目录为准不要硬背旧接口。不同版本之间的接口变化不算太大但细节处总有调整照着源码目录里的示例改比看第三方博客更可靠。如果能顺利跑通一次消息收发说明 libArcus 在你这套环境里是真的可用而不是“刚好能链接”。6.4 我的个人习惯我会在自己的工程根目录放一个deps-versions.txt记录 protoc 版本、ZeroMQ 版本、CMake 版本。每次换机器、换分支先看这个文件。libArcus 本身更新节奏不算快但依赖库版本一换引发的报错五花八门。固定版本比追新更能让你专注在业务上。最后分享一个土办法如果 configure 阶段报错但你确信依赖都已经装好我会直接删掉 build 目录重新配置而不是去改某个变量再 cmake 一次。旧缓存里残留的路径和变量会掩盖很多真相。libArcus 的编译其实没什么玄学把下载来源、子模块、protobuf 版本、ZeroMQ 路径这几件事按顺序理一遍半天时间足够从零到跑通。

相关新闻

PL/SQL Developer 配置与调试实战:Oracle 开发高效工作台

PL/SQL Developer 配置与调试实战:Oracle 开发高效工作台

简介:本资源为Oracle数据库专业开发工具PL/SQL Developer的完整安装包,面向数据库管理员、后端开发工程师及Oracle初学者,解决Oracle环境下的高效编码、调试、对象管理与性能优化等核心开发需求。压缩包为RAR格式,大小19.05MB&…

2026/10/18 6:09:48 阅读更多 →
AI论文网站实战测评:文献检索、降重与辅助写作全指南

AI论文网站实战测评:文献检索、降重与辅助写作全指南

一转眼又到毕业季,朋友圈里全是赶论文的哀嚎。写毕业论文真正让人崩溃的环节,其实不是“写”本身,而是选题拿不准、文献找不到、引用格式调到头秃、查重降不下来这些琐碎到极点的事。所以每年这个时候,“AI论文网站”都会被搜爆。…

2026/10/18 6:09:48 阅读更多 →
FSD v14架构解析:端到端神经网络与纯视觉系统的工程跃迁

FSD v14架构解析:端到端神经网络与纯视觉系统的工程跃迁

FSD v14这个名字放出来之后,我朋友圈里做智能驾驶的人基本都在转。转到内容分两类:一类是路测视频,焦点是它在几个刁钻路口怎么处理,另一类是技术讨论,焦点集中在两个词上——端到端神经网络、纯视觉系统。我属于后者。…

2026/10/18 6:09:48 阅读更多 →

最新新闻

400G多模光纤:为何8通道50G比4通道100G更早落地

400G多模光纤:为何8通道50G比4通道100G更早落地

简介:IEEE Std 802.3cm-2020 是 IEEE 发布的以太网修订标准,聚焦多模光纤上 400Gb/s 的物理层与管理参数,面向光通信工程师、数据中心网络架构师及 400G 光模块研发人员。标准新增 Clause 150,定义了 400GBASE-SR8 与 400GBASE-SR…

2026/10/18 10:36:45 阅读更多 →
400G多模光纤标准解析:SR8与SR4.2的物理层设计差异与工程实践

400G多模光纤标准解析:SR8与SR4.2的物理层设计差异与工程实践

简介:IEEE Std 802.3cm-2020 是 IEEE 发布的以太网修订标准,聚焦多模光纤上 400Gb/s 的物理层与管理参数,面向光通信工程师、数据中心网络架构师及 400G 光模块研发人员。标准新增 Clause 150,定义了 400GBASE-SR8 与 400GBASE-SR…

2026/10/18 10:36:45 阅读更多 →
Linux Socket 编程实战:从可编译实例到多连接服务

Linux Socket 编程实战:从可编译实例到多连接服务

简介:这份资源面向Linux网络编程初学者与需要夯实Socket基础的开发者,系统梳理了Socket通信的核心原理与常用接口。内容从网络中进程如何唯一标识讲起,说明IP地址、协议与端口三元组的作用,并解释Socket作为特殊文件的设计思想&am…

2026/10/18 10:36:45 阅读更多 →
微信小程序远程在线诊疗系统:基于SSM的完整设计与实现

微信小程序远程在线诊疗系统:基于SSM的完整设计与实现

简介:面向高校毕业设计场景的微信小程序远程在线诊疗系统完整项目,后端采用Java SSM框架与MySQL数据库,前端为微信开发者工具构建的小程序,并辅以Vue相关后台管理界面。系统内设管理员、用户、医生三类角色,覆盖科室信…

2026/10/18 10:36:45 阅读更多 →
勇士传说横版卷轴游戏:C#动作游戏源码解析与毕业设计实战

勇士传说横版卷轴游戏:C#动作游戏源码解析与毕业设计实战

简介:这份资源是基于C#开发的「勇士传说」横版卷轴游戏完整源码,面向计算机相关专业做毕业设计的学生,以及希望入门Unity 2D游戏开发的学习者。项目以经典横版卷轴玩法为核心,涵盖角色动画、碰撞检测、地图设计、敌人AI与用户输入…

2026/10/18 10:36:45 阅读更多 →
零基础参与开源Python项目:从Fork到首个PR的完整实战指南

零基础参与开源Python项目:从Fork到首个PR的完整实战指南

1. 先搞清楚开源贡献这件事,远不止写代码很多刚接触开源Python项目的人,以为“做贡献”就等于“提PR改源码”。我最初也是这样想的,甚至一度觉得,自己没写出过有设计感的代码,就不配去动别人的仓库。直到后来真正参与进…

2026/10/18 10:35:45 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

2026/10/18 0:00:55 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →