UE5升级MSB3073错误全解析:从构建系统冲突到Live Coding死锁的根治方案
1. 项目概述从UE5.1到UE5.5的升级之痛如果你正在尝试将项目从虚幻引擎5.1升级到5.5并且在Visual Studio里点击“生成解决方案”后迎面撞上一个冷冰冰的“错误 MSB3073”那么恭喜你你并不孤单。这个错误几乎成了UE5版本升级路上的一个“成人礼”尤其是在涉及C代码的项目中。我最近刚把一个中型项目从5.1.1迁移到5.5.1整个过程堪称一部与编译器和构建系统斗智斗勇的血泪史而MSB3073就是其中最顽固的拦路虎之一。简单来说MSB3073错误本身是一个通用的MSBuild任务错误提示某个自定义构建命令在我们的场景里就是UnrealBuildTool的调用以非零代码退出。但在UE5升级的上下文中它很少是一个孤立的问题而更像是一个症状背后可能藏着引擎模块依赖变化、构建脚本冲突、中间文件残留或者最经典的——Live Coding实时编码会话冲突。这个错误会彻底阻断你在IDE内的编译流程迫使你回到编辑器里点击“编译”或者进行更繁琐的手动清理严重拖慢开发迭代速度。本文将基于我实际的踩坑和解决经验为你系统性地拆解UE5.1升级至UE5.5后出现MSB3073错误的根源并提供一套从快速排查到根治的完整方案。2. 核心问题根源深度剖析MSB3073错误信息通常长这样错误 MSB3073 命令“...\Build.bat ... exited with code 6。这个“code 6”是关键但它只是一个出口代码我们需要深入UnrealBuildTool的日志才能看清真相。根据我的经验在5.1到5.5的升级过程中引发此错误的根源主要集中在以下四个方面它们常常相互交织。2.1 构建系统与中间状态冲突这是最经典、也最高频的原因。UE的构建过程涉及两套系统协同工作一是Visual Studio或Rider调用的MSBuild它负责组织解决方案和项目文件二是UnrealBuildToolUBT这是Epic自家用C#写的核心构建工具负责解析.Target.cs、.Build.cs文件并调用平台特定的编译器如MSVC和链接器。当你从UE5.1升级到UE5.5时引擎本身的构建脚本、模块定义文件可能发生了变动。问题在于你的项目本地还残留着大量为UE5.1生成的中间文件例如Intermediate/目录下的构建脚本、已解析的依赖关系、预编译头PCH等。当UBT在5.5环境下运行时它可能会读取到这些陈旧的、格式或内容不兼容的中间状态从而导致内部逻辑错误最终表现为UBT进程异常退出退出码非0进而触发MSBuild报出MSB3073。这本质上是一种“版本污染”。2.2 Live Coding会话死锁Live Coding是UE一个极其实用的功能允许你在不重启编辑器的情况下重编译并重载C代码。但其实现机制决定了它会在内存中持有一个“热重载会话”。当你通过Visual Studio触发编译时MSBuild会调用UBT而UBT在开始构建前会检查是否存在活跃的Live Coding会话通过一个名为LiveCoding的全局互斥锁。如果编辑器正在运行或者上一次非正常退出导致互斥锁未被正确释放UBT就会检测到冲突。在UE5.1时期这个检查的逻辑和错误处理可能相对宽松但到了UE5.5引擎对构建状态的健壮性要求更高相关检查可能更严格导致更容易触发此错误并明确中止构建。这就是为什么社区里很多解决方案的第一步都是“关闭编辑器禁用Live Coding”。2.3 模块依赖图解析失败从UE5.1到5.5引擎模块的拆分、合并或依赖关系可能发生了调整。例如某些实验性模块被移入核心或者一些插件所需的公共依赖项发生了变化。你的项目.Build.cs文件中PublicDependencyModuleNames和PrivateDependencyModuleNames列表如果还保持着5.1时代的配置可能会引用一个在5.5中已更名、移除或需要额外条件编译的模块。UBT在解析这些依赖时会构建一个模块依赖图。如果某个模块无法找到比如你写错了名字或者存在循环依赖UBT可能在解析阶段就抛出异常并退出。这种错误在Visual Studio的输出窗口里可能看不全必须查看UBT的详细日志文件才能定位到具体是哪个模块出了问题。2.4 项目文件与引擎版本不匹配通过右键点击.uproject文件“生成Visual Studio项目文件”所创建的.sln和.vcxproj文件其中包含了指向特定引擎版本的工具链路径、预处理器定义和构建事件。从5.1升级到5.5后如果你没有重新生成这些项目文件或者生成过程不完整例如某些子模块的.vcxproj没更新那么MSBuild使用的路径可能仍然指向旧的5.1引擎目录或工具集。当MSBuild执行构建后事件调用Build.bat时传递的参数或环境变量是基于旧项目文件配置的这可能导致UBT加载了错误版本的引擎程序集或配置文件进而引发兼容性错误和构建失败。这种情况常伴随着一些找不到文件或程序集的次级错误。3. 系统性排查与解决流程面对MSB3073不要盲目尝试网上找到的单一方法。我推荐遵循一个从简到繁、从外到内的系统性排查流程这能帮你最快定位问题所在。3.1 第一步检查与清理——解决80%的常见问题首先进行最无侵入性的操作这能解决大部分由临时状态引起的问题。关闭所有相关进程完全关闭Unreal Editor和Visual Studio。使用任务管理器确保UnrealEditor.exe、UnrealEditor-Win64-DebugGame.exe以及任何你的游戏进程都已结束。这一步是为了释放任何可能持有的文件锁或互斥锁。尝试在编辑器内编译直接双击你的.uproject文件打开Unreal Editor。如果项目需要编译编辑器会提示你。点击“是”进行编译。如果编辑器内编译成功但VS里失败那问题极大概率出在IDE集成或Live Coding上。执行“核弹级”清理如果编辑器编译也失败或者你想确保一个干净的起点需要手动删除项目目录下的生成文件和中间文件。请注意操作前请确保项目源码已提交或备份。删除Binaries文件夹这是编译输出的可执行文件和动态库所在位置。删除Intermediate文件夹这是UBT生成的临时文件、预编译头、构建脚本的所在地。这是清理的关键。删除Saved文件夹这里存放着编辑器偏好设置、派生数据缓存DDC的本地副本等。删除Saved/DerivedDataCache可以强制引擎重新生成着色器和资源派生数据有时能解决因缓存不一致导致的问题。删除.vs文件夹这是Visual Studio的解决方案特定缓存目录隐藏的需要显示隐藏文件才能看到。删除*.sln和*.vcxproj文件移除旧的项目文件。重新生成项目文件在清理完成后右键点击你的.uproject文件选择“Generate Visual Studio project files”。等待命令行窗口运行完毕。在Visual Studio中执行完整重建用VS打开新生成的.sln文件。在解决方案资源管理器中右键点击你的游戏项目通常是带粗体的那个选择“重新生成”。不要直接点“生成”先进行“重新生成”这能确保所有东西都从头编译。经过以上五步大部分因文件残留和项目文件过时导致的MSB3073错误都能被解决。如果问题依旧我们需要深入更具体的场景。3.2 第二步诊断Live Coding与互斥锁问题如果清理后第一次在VS中编译成功但第二次或第N次编译时MSB3073复现那么Live Coding冲突的嫌疑就非常大。查看UnrealBuildTool日志这是诊断的金标准。日志文件位于%LOCALAPPDATA%\UnrealBuildTool\Log.txt。用文本编辑器打开它滚动到最底部查找最近一次的构建记录。你会看到类似这样的关键信息Checking for live coding mutex: Global\LiveCoding_D:Epic GamesUE_5.5EngineBinariesWin64UnrealEditor.exe Unable to build while Live Coding is active. Exit the editor and game, or press CtrlAltF11 if iterating on code in the editor or game BuildException: Unable to build while Live Coding is active...如果看到上述信息确认是Live Coding冲突。解决方案A使用热键终止会话如果Unreal Editor正在运行并且你刚刚在编辑器里进行了代码修改可以尝试在编辑器窗口激活的状态下按下Ctrl Alt F11。这通常会强制终止当前的Live Coding会话并允许外部构建继续。你可以在VS里再次尝试编译。解决方案B彻底禁用Live Coding进行构建有时热键可能失效或者会话处于不稳定状态。最彻底的方法是临时禁用Live Coding。在Unreal Editor中打开“编辑” - “编辑器偏好设置”。在左侧找到“常规” - “性能”。在右侧找到“实时编码”部分取消勾选“启用实时编码”。关闭编辑器再回到VS中尝试编译。注意这只是为了诊断和解决构建问题问题解决后可以重新启用这是一个非常有用的开发功能。解决方案C处理残留互斥锁高级在极少数情况下进程崩溃可能导致命名互斥锁未被操作系统释放。此时可以尝试重启电脑这是释放所有全局内核对象包括互斥锁最有效的方法。如果问题在重启后特定操作下复现则需从程序逻辑上排查。3.3 第三步分析UnrealBuildTool详细日志与错误码如果上述步骤都无效我们需要对UBT的失败进行更精细的“尸检”。仅仅MSB3073和“exited with code 6”是不够的退出码Exit Code的含义需要结合UBT的源代码或常见模式来解读。我们需要获取更详细的日志。启用详细构建日志在Visual Studio中打开“工具” - “选项”。导航到“项目和解决方案” - “生成并运行”。将“MSBuild 项目生成输出详细信息”从“最小”改为“详细”或“诊断”。重新构建观察“输出”窗口视图 - 输出选择显示输出来源为“生成”。在密密麻麻的输出中寻找来自Build.bat或UnrealBuildTool的错误信息这可能会比简单的退出码更有用。直接运行构建命令有时VS的输出会被截断。我们可以打开命令提示符CMD手动执行失败的那个命令从而看到完整的输出。命令格式如下你的引擎路径\Engine\Build\BatchFiles\Build.bat [你的项目名]Editor Win64 Development -Project你的项目.uproject完整路径 -WaitMutex -FromMsBuild例如D:\UE_5.5\Engine\Build\BatchFiles\Build.bat MyGameEditor Win64 Development -ProjectD:\Projects\MyGame\MyGame.uproject -WaitMutex -FromMsBuild在命令行中运行所有错误信息都会完整打印在控制台方便你复制和搜索。常见的错误可能包括找不到特定模块、C#脚本编译错误UBT自身是C#程序、序列化Target.cs文件失败等。解读常见退出码退出码 1: 通常表示一般性错误需查看具体日志。退出码 5/6: 在UE构建上下文中常与访问被拒绝、文件锁冲突或Live Coding冲突相关。退出码 3: 可能表示UBT命令行参数解析错误。退出码 -532462766(或其它巨大负数)这通常是未处理的异常导致的Windows错误代码需要查看异常堆栈。3.4 第四步检查模块依赖与引擎兼容性如果手动命令也失败并且错误信息指向某个模块无法找到或加载就需要检查依赖关系。核对.Build.cs文件打开你项目下每个模块的*.Build.cs文件通常在Source/项目名/和Source/项目名Editor/下。逐行检查PublicDependencyModuleNames和PrivateDependencyModuleNames数组。移除已废弃的模块对比UE5.1和5.5的官方文档或源码查看是否有模块被重命名或移除。例如某些插件模块可能已被整合。添加新增的依赖UE5.5可能为某些功能引入了新的核心模块依赖。例如如果你使用了Enhanced Input系统确保依赖了正确的模块。注意大小写和拼写模块名称必须完全匹配。验证插件兼容性检查项目中使用的所有第三方插件。前往插件目录项目或引擎的Plugins文件夹查看插件是否有针对UE5.5的更新版本。许多为5.1设计的插件在5.5上可能需要重新编译甚至修改代码。可以尝试临时禁用非必要插件看编译是否能通过以定位问题插件。检查引擎源码完整性如果你使用源码版如果你是从源码构建的UE5.5请确保源码拉取完整并且没有本地修改与升级冲突。可以尝试重新运行Setup.bat和GenerateProjectFiles.bat来重新配置和生成引擎自身的解决方案。4. 高级疑难杂症与特定场景解决方案经过以上四步90%的MSB3073问题应该都能得到解决。但如果你的情况比较特殊可以看看下面这些场景是否对得上。4.1 场景仅“Development Server”配置失败有开发者反馈在VS中选择“Development Editor”配置编译运行正常但选择“Development Server”配置则报MSB3073。这通常是因为Server target的构建配置存在差异。检查Target.cs文件你的项目应该有一个项目名Server.Target.cs文件。打开它检查其配置是否与项目名Editor.Target.cs有显著不同特别是ExtraModuleNames列表。确保Server target包含了所有必要的游戏模块。服务器模块依赖有些模块可能只在客户端需要在服务器端不需要或甚至不应包含。反之服务器可能需要一些专用的模块。检查你的游戏模块的.Build.cs文件看看是否有使用if (Target.Type TargetRules.TargetType.Server)这样的条件编译来添加或移除依赖。条件逻辑错误可能导致服务器构建时找不到模块。尝试重建Server Target在项目根目录运行命令行引擎路径\Engine\Build\BatchFiles\Build.bat 项目名Server Win64 Development -Project项目路径。观察命令行输出的具体错误。4.2 场景升级后首次编译成功后续编译失败这强烈指向构建状态缓存问题。除了彻底清理Intermediate文件夹外还需注意共享派生数据缓存DDC如果团队使用网络共享的DDC确保DDC服务器已为UE5.5重新生成过资源。本地Saved/DerivedDataCache清理后引擎会从共享DDC下载如果共享缓存仍是5.1格式可能导致问题。可以尝试在编辑器偏好设置中临时禁用共享DDC仅使用本地缓存。Visual Studio IntelliSense 数据库VS的.ipch等智能感知缓存文件有时会干扰。执行“清理解决方案”然后关闭VS删除项目目录下的.vs文件夹再重新打开。4.3 场景多项目解决方案中的依赖问题如果你的解决方案包含多个游戏项目或工具项目并且它们之间存在引用关系。确保构建顺序正确在VS中右键解决方案 - “项目生成依赖项” - “项目生成顺序”确保被依赖的项目先构建。检查项目间引用确保项目引用是通过.vcxproj文件中的正确方式添加的而不仅仅是在UE模块层面依赖。有时需要手动在VS里添加对另一个项目输出目录的引用。5. 根治与预防建立稳健的升级与构建习惯解决一次问题不如建立避免问题的习惯。以下是我从多次引擎升级中总结出的最佳实践升级前备份与隔离在升级引擎版本前务必使用版本控制系统如Git提交所有更改。或者直接将项目复制一份在副本上进行升级测试。永远不要在唯一的工作副本上直接进行大版本升级。遵循官方的升级指南访问Unreal Engine官方文档阅读从5.1到5.5的升级说明。里面会列出破坏性变更、废弃的API和必要的迁移步骤。这是最重要的准备工作。顺序操作法a. 备份项目。b. 关闭所有编辑器、IDE。c. 删除项目下的Binaries,Intermediate,Saved,.vs,*.sln,*.vcxproj*文件。d. 确保安装好目标版本的引擎5.5。e. 右键点击.uproject文件选择“Switch Unreal Engine version...”切换到5.5。f. 再次右键选择“Generate Visual Studio project files”。g. 用VS打开先尝试“重新生成”解决方案。善用命令行工具进行诊断遇到IDE内构建失败养成第一时间打开命令行手动运行Build.bat的习惯。原始的错误输出是诊断的黄金信息。可以将输出重定向到文件以便仔细分析Build.bat ... build_log.txt 21。保持引擎安装的整洁尽量避免在引擎目录Epic Games\UE_5.5内安装插件或存放个人项目。使用项目本身的Plugins文件夹或引擎的全局插件目录。这能减少引擎本身被污染的风险。考虑使用项目启动器对于需要频繁切换引擎版本或项目配置的开发者使用像Epic Games Launcher创建的快捷方式或者自己编写批处理脚本启动特定版本的编辑器和生成项目文件可以减少手动操作带来的错误。MSB3073在UE升级过程中虽然令人头疼但本质上是一个“状态管理”问题。它提醒我们现代游戏引擎的构建是一个复杂的、有状态的过程。通过系统性的清理、诊断和对构建流程的理解我们不仅能解决眼前的问题也能更深入地掌握UE项目的构建脉络从而在未来的开发中更加游刃有余。当你成功驯服这个错误看着项目在UE5.5下顺利编译运行时那种成就感或许就是技术从业者独有的乐趣吧。

相关新闻

零代码AI技能开发实战:从QClaw到微信生态的“恋爱大师”

零代码AI技能开发实战:从QClaw到微信生态的“恋爱大师”

1. 从“技术玩具”到“情感助手”的意外转型 去年年底,我偶然接触到了QClaw这个低代码AI技能开发平台。当时的心态很纯粹,就是想找个周末项目练练手,看看能不能把一些天马行空的想法快速落地。作为一个在技术圈摸爬滚打多年的“老油条”&…

2026/10/17 3:01:57 阅读更多 →
AI大模型流式输出:SSE协议为何优于WebSocket与WebRTC?

AI大模型流式输出:SSE协议为何优于WebSocket与WebRTC?

1. 项目概述:AI大模型实时通信的技术选型之争最近在设计和实现几个AI大模型应用的后端服务时,我反复被一个看似基础、实则关键的问题所困扰:如何为AI大模型的实时文本流输出选择最合适的通信协议?无论是构建一个类ChatGPT的对话应…

2026/10/18 1:59:19 阅读更多 →
Spring Boot SSE实战:解决连接中断、超时与资源泄漏的完整方案

Spring Boot SSE实战:解决连接中断、超时与资源泄漏的完整方案

1. 从一次线上告警说起:SSE连接为何突然中断? 那天下午,我正在处理一个实时数据看板的项目,突然收到一连串的告警通知。用户反馈说,看板上的数据流“卡住”了,不再更新。我立刻登录服务器查看日志&#xff…

2026/10/17 8:27:12 阅读更多 →

最新新闻

Flutter工程规范实战:用Claude Code和Codex约束AI写代码

Flutter工程规范实战:用Claude Code和Codex约束AI写代码

最近我在几个 Flutter 项目里试了用 Claude Code 和 Codex 来写代码,效果确实惊艳,但翻车概率也一点都不低。最典型的情况是:AI 能独立完成一个小功能,却会在你根本没注意到的地方破坏既有约定——混用状态管理方案、跳过异常处理…

2026/10/19 3:17:05 阅读更多 →
YOLOv8基建裂缝检测系统:轻量高鲁棒的工程落地实践

YOLOv8基建裂缝检测系统:轻量高鲁棒的工程落地实践

1. 项目概述:为什么一个“基建裂缝检测系统”值得用YOLOv8重做一遍你可能已经见过不少用YOLO系列做裂缝识别的Demo——拍张照片,框出几条灰白细线,再打个“裂缝:0.87”的标签,就叫“智能巡检”。但真把它拉进某高铁桥墩…

2026/10/19 3:17:05 阅读更多 →
基于Python与深度学习的植物病虫害识别系统设计与实现

基于Python与深度学习的植物病虫害识别系统设计与实现

1. 项目整体设计与技术选型植物病虫害识别这几年一直是农业信息化里的热门方向,真正落地做过的朋友都知道,难点不在模型本身,而是“识别”这个动作如何被最终用户方便地使用。我这次做的这套基于Python的植物病虫害识别系统,目标很…

2026/10/19 3:17:05 阅读更多 →
基于Python的植物病虫害识别系统实战:从模型训练到前后端部署

基于Python的植物病虫害识别系统实战:从模型训练到前后端部署

1. 项目价值与整体定位看到“基于Python的植物病虫害识别系统”这个标题时,我第一反应是这应该是一个典型的“算法工程”相结合的综合型项目。它既要解决“能不能识别出来”的算法问题,又要解决“别人怎么用”的工程落地问题。前后端源码意味着它不仅仅是…

2026/10/19 3:17:05 阅读更多 →
二进制部署Kubernetes高可用:从单master到双master+双LB实践

二进制部署Kubernetes高可用:从单master到双master+双LB实践

做二进制方式部署 Kubernetes 的人,多少带点“倔”——不想被 kubeadm 那堆自动生成的证书和静态 Pod 挡住视线,就想亲手把 etcd、apiserver、controller-manager、scheduler 一个个进程拉起来,看它们到底是怎么协作的。我前阵子刚把一套“单…

2026/10/19 3:17:05 阅读更多 →
Metadef实践指南:CANN自定义算子开发的基石

Metadef实践指南:CANN自定义算子开发的基石

Metadef 这个名字在自定义算子开发圈子里,说实话一开始很容易被忽略。很多人刚接触 CANN 算子开发时,目光全放在 kernel 怎么实现、tiling 怎么切分上,等真正动手写第一个算子才发现,最卡脖子的不是计算逻辑,而是“这个…

2026/10/19 3:16:05 阅读更多 →

日新闻

频率跟踪型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/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出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/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/18 12:16:16 阅读更多 →