news 2026/9/16 21:01:37

UE4 C++项目生成失败:UnrealBuildTool工具链与环境排查

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UE4 C++项目生成失败:UnrealBuildTool工具链与环境排查

.uproject右键点下Generate Visual Studio project files,进度条刚爬过一半,一个标题为UnrealBuildTool.exe的小窗口直接弹出来,底下跟着-game -rocket -progress这一串参数,再往下就是几行红色的ERROR。这个画面我见过太多次了,第一次遇到的时候我甚至以为是引擎装坏了,把整个 UE4 卸载重装了两遍,问题依旧。后来才明白,这个报错几乎跟你写的 C++ 代码没关系,它出在"项目文件生成"这一步——也就是 UnrealBuildTool 去问操作系统"我的编译器在哪、SDK 在哪、我这台机器能不能编 C++"的时候,没问出答案。

这篇东西想聊的就是这件事:UE4里生成C++项目时UnrealBuildTool.exe报错的完整排查思路。它适合三类人——刚装完引擎、第一次建 C++ 项目的入门玩家;从蓝图转向 C++、被工具链教育了一顿的开发者;以及在团队里负责搭环境、被同事追着问"为什么我这台机器不行"的人。整个排查链条从日志定位讲到工作负载勾选、版本矩阵、SDK 与运行库依赖,最后落到命令行手动生成工程文件和长期维护规范,你照着走一遍,基本能自己定位到病根。

1. 先搞懂这个报错到底是谁在喊疼

很多人一看到弹窗标题是UnrealBuildTool.exe,第一反应是"引擎有 Bug"。其实恰恰相反,这个报错说明工具链在正常工作——它认真地尝试了一遍,然后诚实地告诉你缺东西。搞清楚这一步到底发生了什么,比记住一堆修复偏方有用得多。

1.1 UnrealBuildTool 在生成项目时到底干了什么

UnrealBuildTool(后面统一简称 UBT)是 UE 自带的构建系统,它是一个用 C# 写的独立程序,跟着引擎一起发布,位于Engine/Binaries/DotNET/目录下(UE4.24 之后的版本路径里还会多一层同名文件夹)。它的职责比一般人想象的要重:不只是编译,还包括扫描模块依赖、读取.Build.cs.Target.cs、决定用哪个平台工具链、生成工程文件、最后驱动 MSBuild 去干活。

当你点"Generate Visual Studio project files"的时候,实际发生的是一次完整的环境探测:UBT 会去注册表和文件系统里找 Visual Studio 的安装位置,确认里面有没有 C++ 工具链组件,确认 Windows SDK 的版本是否落在引擎允许的区间内,确认 .NET 运行时是否能加载它自己。只有这些全部通过,它才会去生成.sln.vcxproj

所以这个报错的本质是环境探测失败,而不是代码编译失败。这两者的区别很重要:编译失败时你至少能看到具体的.cpp文件名和行号;环境探测失败时,报错信息往往只有一句干巴巴的"找不到工具链",看起来毫无头绪。理解了这个定位,后面的排查方向就不会跑偏——你不需要去看代码,需要去看机器上装了什么。

1.2 -game -rocket -progress 这三个参数是线索不是病因

很多人会把这串参数当成错误代码去搜,这是典型的误判。-game-rocket-progress是 UE 项目文件生成过程中的标准启动参数,含义大致是:

  • -game:表示这是一次游戏项目的构建,会过滤掉引擎内部工具模块,只关注游戏相关目标;
  • -rocket:指使用"Rocket"构建分支,也就是通过 Epic Games Launcher 安装的正式版引擎,区别于从源码自己编出来的引擎;
  • -progress:要求输出进度信息,避免命令行长时间静默。

这三个参数会出现在几乎所有生成工程文件的场景里,无论成功还是失败。所以你搜索报错时把它们带上,反而会搜到大量无关结果。真正有诊断价值的是参数后面那段ERROR:开头的文字,以及 UBT 写下的日志文件。下次再看到这个弹窗,把注意力从标题挪到正文第一行ERROR:才是正解。

1.3 日志在哪,怎么三分钟锁定真凶

UBT 的日志位置在不同版本里略有差别,我把常见的几个位置列出来,建议按顺序找:

日志位置适用情况
引擎目录/Engine/Programs/UnrealBuildTool/Log.txtUE4.26 及以前最常用,记录完整探测过程
项目目录/Saved/Logs/UnrealBuildTool/新版引擎按时间戳分文件,排查当次失败首选
项目目录/Saved/Logs/UnrealVersionSelector-*.log右键菜单调用版本选择器时的记录
%LOCALAPPDATA%/UnrealBuildTool/Log.txt部分版本在此写入全局日志

打开日志后,用搜索框搜ERRORException两个关键词,通常滚动到文件末尾往前找更快。日志里会明确写出 UBT 找到了几个 Visual Studio 安装、每个安装的版本号是多少、是否有 C++ 工具链、SDK 版本是否满足要求。比如你会看到类似"Found Visual Studio installation: ... but it doesn't have the required C++ toolchain"这样的句子,一句话就把病根交代清楚了。

提示:如果日志文件根本不存在,说明 UBT 还没跑到写日志那一步就崩了,这种情况优先怀疑 .NET 运行时缺失或引擎目录权限异常。

2. 环境体检:九成失败都出在这三样东西上

把近年遇到的案例统计一下,生成 C++ 项目失败的原因高度集中在三类:Visual Studio 工作负载没勾全、引擎与 VS 版本不匹配、SDK 与运行时缺失。这三类问题占了我遇到案例的九成以上,而且它们有个共同特点——都是"看起来装好了"但实际缺组件。

2.1 Visual Studio 工作负载的勾选陷阱

这是最高频的坑,没有之一。Visual Studio 的安装器默认勾选的是"使用 C++ 的桌面开发",而 UE4 需要的是"使用 C++ 的游戏开发"这个工作负载。两者看起来差不多,但后者才会装上 UBT 真正依赖的组件。如果你装的是"桌面开发",UBT 通过vswhere.exe查询Microsoft.VisualStudio.Component.VC.Tools.x86.x64这个组件 ID 时就会查询失败,于是报"找不到工具链"。

"使用 C++ 的游戏开发"工作负载里,真正关键的反而是下面这几个可选组件:

  • MSVC v142 - VS 2019 C++ x64/x86 生成工具:编译器本体,没有它就没有cl.exe
  • Windows 10 SDK:UBT 需要用它来解析平台 API,版本要落在引擎允许区间;
  • C++ 分析工具:可选,但装了之后排查崩溃会方便很多;
  • Unreal Engine 安装程序 / Unreal Engine 4 组件:VS2019 16.3 之后提供的组件,装完后 VS 能直接识别.uproject,还能省掉一部分手动生成工程文件的步骤。

顺便说一个很容易被忽略的点:如果你装过多个版本的 VS,UBT 默认会挑最新的那个。假设你机器上有 VS2017 和 VS2019,但只有 VS2017 装了完整游戏开发工作负载,UBT 选了 VS2019 之后照样报错。这种情况要么补齐 VS2019 的组件,要么在生成时显式指定版本(后面会讲命令行怎么加参数)。

2.2 引擎版本与 VS 版本的兼容对照表

UE4 对 Visual Studio 版本有明确的区间要求,太老不行,太新也可能不行。尤其是 VS2019 在 16.11 这个版本上,跟 UE4.26 和 UE4.27 存在已知的编译兼容问题,会让原本正常的项目突然编不过。这个坑的迷惑性在于:你什么都没改,只是 VS 自动更新了一下,项目就崩了。

下面这张表是我自己整理并验证过的常用对照,可以作为装机时的参考:

引擎版本推荐 VS 版本需要注意的问题
UE4.20 及以前VS2017 15.6+不支持 VS2019,装了也识别不到
UE4.21 - UE4.24VS2017 15.6+ 或 VS2019 16.4+两个版本都能用,优先 VS2017
UE4.25VS2019 16.4+开始正式推荐 VS2019,VS2017 仍可
UE4.26 - UE4.27VS2019 16.4 - 16.1016.11 有已知问题,建议锁版本
UE5 早期VS2019 16.11+ 或 VS2022VS2022 需要改 UBT 的版本白名单

关于"锁版本"这件事,实操上我一般建议在 VS 安装器里关掉自动更新,或者把 VS2019 固定在 16.10 或 16.11 之前的某个版本。VS 安装器允许安装历史版本,这一步虽然多花十分钟,但能省掉后面几小时的排查。如果你已经升到了有问题的版本,两个选择:装一个并行的旧版本 VS,或者在引擎源码里找到 UBT 的版本校验逻辑做调整——但后者只建议源码引擎用户做,Launcher 安装的引擎改了也会在下次校验时恢复。

2.3 Windows SDK、.NET 与运行库的隐性依赖

Windows SDK 的问题通常是"版本不对"而不是"没有"。UBT 在WindowsPlatformSDK.cs里写了一套最低和最高版本限制,如果你装的 SDK 比最低版本还低,或者装了引擎不支持的新版本(新版本刚出来时经常不被支持),都会触发探测失败。查看本机 SDK 的路径是C:\Program Files (x86)\Windows Kits\10\Include,里面的文件夹名就是版本号。

.NET 这块要分清楚两个概念:UBT 本身是用 C# 写的,需要 .NET 运行时来启动;同时,VS 的 C++ 相关工具也依赖运行库。UE4.20 到 4.27 期间,UBT 的目标框架大致是 .NET Framework 4.6.2,只要系统里有 4.6.2 或更高的 4.x 版本通常就够。但如果你手动清理过系统组件,或者用的是精简过的系统镜像,就可能缺这块。

还有一个经常被冤枉的东西是Microsoft Visual C++ Redistributable。严格来说,它跟生成项目文件这一步关系不大——它主要影响的是程序运行时,不是编译时。网上很多答案让你装 VC++ 运行库,装了没用就是这个原因。不过它确实会在后续运行打包好的游戏时用到,属于"顺手装上不亏,但别指望它修好编译报错"的那类组件。

注意:装 SDK 和运行库之后,建议重启一次 Visual Studio 和 Epic Games Launcher。UBT 会在启动时缓存环境信息,不重启可能导致刚装好的组件依然"看不见"。

3. 从零复现到修复的完整实操流程

上一节讲的是"该装什么",这一节讲"怎么验证装对了"。很多人卡住不是因为没装对,而是因为装完之后没有清理缓存,UBT 读的还是旧的探测结果。下面这套流程我基本是固定照做的,从清理到验证一共四步。

3.1 第一步永远是清干净残留

在怀疑任何东西之前,先把上一次失败的残留删掉。UBT 会把中间产物写在几个固定目录里,这些文件如果是在环境不完整的状态下生成的,会一直影响后续判断。需要清理的是项目目录下的这几个:

  • Binaries/:编译出来的二进制和中间文件;
  • Intermediate/:UBT 生成的构建中间数据,最容易残留错误信息;
  • Saved/:项目层面的日志和配置缓存,删除前可以先备份日志;
  • .vs/:Visual Studio 自己的缓存目录,隐藏文件夹,容易漏;
  • 项目根目录下的.sln.vcxproj:这些是生成失败时留下的半成品,一并删掉。

清理的理由很直接:UBT 判断"是否需要重新生成工程文件"时会参考这些文件的时间戳和内容。如果Intermediate里存在一份记录的 SDK 版本是旧的,UBT 可能直接复用而不重新探测,你会陷入"明明装好了却还是报同样的错"的循环。

引擎目录下的BinariesIntermediate我不建议随便删,尤其 Launcher 安装的版本,删了之后如果环境不完整可能连引擎都启动不了。真要清理引擎侧,只针对Engine/Programs/UnrealBuildTool目录下的日志文件,把旧日志删掉,方便下次看新的。

3.2 用命令行手动生成工程文件

右键菜单那套走的是 UnrealVersionSelector,中间多了一层,出错时信息反而少。直接调GenerateProjectFiles.bat能看到完整输出,排查效率高很多。命令形式大致如下:

"C:\Program Files\Epic Games\UE_4.27\Engine\Build\BatchFiles\GenerateProjectFiles.bat" ^ -project="D:\Projects\MyGame\MyGame.uproject" ^ -game -rocket -progress -2019

这里有几个细节值得说明。-project=后面必须写.uproject的完整绝对路径,用引号包起来,避免空格被当成参数分隔符。末尾的-2019(或-2017-2022)用来指定目标 VS 版本,机器上装了多个版本时这个参数非常有用,能强制 UBT 用你指定的那个。如果不加,UBT 会按自己的优先级挑一个。

如果你在用源码编译的引擎,GenerateProjectFiles.bat的路径在Engine/Build/BatchFiles/下是一样的,但生成出来的工程文件会包含引擎源码,体积大很多,第一次生成要等几分钟,属于正常现象。

执行之后,命令行会逐行打印探测过程。看到Visual Studio 2019 found之类的字样说明识别成功;看到ERROR就往下读几行,通常紧跟着就是具体缺什么。这个过程比弹窗友好太多了,我个人建议把它当成标准操作,不要依赖右键菜单。

3.3 用 vswhere 自查工具链是否被识别

UBT 找 VS 用的是微软官方的vswhere.exe,你也可以用同一个工具自查,这样能站在 UBT 的视角看问题。这个工具默认在C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe。执行下面这条命令:

"C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe" ^ -latest -products * ^ -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 ^ -property installationPath

如果输出了一条 VS 的安装路径,说明 C++ 工具链组件确实存在,UBT 应该能识别到,问题可能在别处。如果什么都没输出,那基本可以确定是工作负载没勾全——UBT 的判定逻辑跟这条命令几乎是一样的,这个组件的 GUID 在 UBT 源码里是硬编码的。

同样的思路还能查其他组件,比如把-requires换成Microsoft.VisualStudio.Component.Windows10SDK.18362可以确认特定版本的 Windows SDK 是否装上。这种自查方式的好处是给出确定性答案,不用靠猜。我在帮同事远程排查时,一般第一件事就是让他跑这条命令,比问"你装没装 C++ 工具"高效得多。

3.4 手动调 UBT 编译验证链路

工程文件生成成功之后,可以再往前推一步,直接调 UBT 做一次编译验证,确认从"能生成工程"到"能编译"之间没有断点。命令形式如下:

"C:\Program Files\Epic Games\UE_4.27\Engine\Build\BatchFiles\Build.bat" ^ MyGameEditor Win64 Development ^ -project="D:\Projects\MyGame\MyGame.uproject" ^ -waitmutex

第一个参数是目标名,一般是项目名加Editor;第二个是平台,Windows 上就是Win64;第三个是配置,开发阶段用Development-waitmutex用来避免多个构建任务抢锁,多人协作或者开着 VS 的时候建议加上。

这一步如果报错,错误信息就比生成阶段具体多了,通常会直接指向某个.Build.cs文件或者某个模块的依赖问题。也就是说,走到这一步报错,问题性质已经从"环境"变成了"代码/配置",排查方向完全不同。能顺利走到这一步,说明你的工具链已经全通了。

4. 报错原文对照表与逐个击破

日志读多了之后会发现,UBT 的报错文本其实相当固定,翻来覆去就那么几句。我把最常见的一批整理成对照表,配套给出处理方向。这张表我建议存下来,遇到报错先对一下,能省掉大量搜索时间。

4.1 找不到编译器与退出码系列

报错文本关键片段含义处理方向
Could not find the compiler没找到cl.exe检查 VS 的 MSVC 生成工具组件
Visual Studio ... must be installed指定版本 VS 不存在装对应版本,或用-2019指定已有版本
Visual C++ toolchain ... is not installed有 VS 但缺 C++ 工具链补装"使用 C++ 的游戏开发"工作负载
exited with code 6UBT 探测阶段失败优先查工具链与 SDK,代码无关
BUILD FAILED且前面无.cpp路径环境问题而非代码问题回到第 2 节做环境体检

退出码 6 值得单独说一句。UBT 的退出码语义在不同版本里略有差异,但 6 基本都指向"找不到可用的编译工具链"。很多人在搜exited with code 6时会搜到各种五花八门的答案,其中不少是讲代码错误的,方向就错了。看到这个码,直接往工具链方向查,别浪费时间。

4.2 路径含中文、空格与超长路径

这是第二高频的坑,而且特别隐蔽,因为报错文本往往不会直接说"你的路径有中文"。UBT 内部有大量字符串处理逻辑,早期版本对非 ASCII 路径支持不完善,中文、日文、韩文路径都可能触发解析异常,表现出的错误却千奇百怪。

具体要注意三点。第一,项目路径和引擎路径都不要有中文,这是硬性要求,D:\我的项目\这种路径一定要改掉。第二,尽量避免空格,虽然 UE 本身能处理带空格的路径,但中间经过批处理脚本、MSBuild、第三方工具的多层传递,空格容易在某一层被吃掉,导致路径错位。第三,控制总长度,Windows 传统的路径长度上限是 260 个字符,UE 的项目路径又特别深(Intermediate/Build/Win64/...往下能嵌套十几层),很容易撞上限。项目放在盘符根目录下的短路径里最省事,比如D:\UEProj\MyGame\

还有一个容易忽略的点:用户目录带中文。有些工具会在%USERPROFILE%下写缓存,如果你的 Windows 用户名是中文,某些路径也会跟着变成中文。这个改起来麻烦,一般不需要动,但如果排查到最后所有常规原因都排除了,可以往这个方向想一想。

4.3 MSB 系列工具集错误

MSB开头的错误码是 MSBuild 抛出来的,说明 UBT 已经成功生成工程文件,进入实际构建阶段了。常见的有:

  • MSB8020:找不到指定平台工具集。比如工程文件里写的是v142(VS2019 的工具集),但机器上只有v141(VS2017 的),就会报这个。处理方式是装对应版本的 VS,或者在生成工程文件时指定正确的版本参数。
  • MSB6006:调用的外部程序异常退出。典型场景是CL.exe退出码为负的大数值,通常意味着编译器进程本身启动失败,可能是缺运行库或被杀毒软件拦截。
  • MSB4236:找不到指定的 SDK。这个基本就是 Windows SDK 版本不匹配,回到 2.3 节处理。

看到MSB系列错误其实是个好消息,说明你已经跨过了环境探测这一关,剩下的问题相对具体。处理思路就是按错误码查,同时把工程文件重新生成一遍,确保里面的工具集版本跟实际装的一致。

4.4 权限、杀软与磁盘空间

这三个属于"概率低但一旦撞上就很难想到"的类型,放在最后讲但别忽略。

权限方面,如果你的引擎装在C:\Program Files下(默认路径就是这里),而项目放在需要管理员权限才能写的目录里,UBT 写中间文件时会被拒绝。表现是生成过程跑到一半突然失败,日志里能看到Access is denied之类的字样。解决办法很简单:项目目录挪到普通用户可写的位置,或者给引擎目录的BinariesIntermediate加上写权限。

杀软方面,实时防护会在 UBT 频繁读写大量小文件时进行扫描甚至锁文件,导致构建随机失败。这个问题的特征是"时好时坏",重试几次有时能过。如果观察到这种模式,可以把引擎目录和项目目录加入杀软的白名单。

磁盘空间方面,一个完整的 UE4 项目编译中间产物轻松吃掉几十个 G,加上引擎本身、派生数据缓存,磁盘剩余空间低于 30G 时就可能出现各种莫名其妙的失败。这个检查起来最快,顺手看一眼就行。

提示:排查顺序建议按"磁盘空间 → 权限 → 杀软 → 路径 → 工具链 → SDK"来,前三项一分钟能查完,不要一上来就重装 VS,那是最费时间的操作。

5. 装机顺序与长期维护的实操心得

前面讲的都是"出问题怎么修",这一节讲讲"怎么让它别出问题"。踩了这么多坑之后我最大的感受是:UE4 的环境问题,绝大部分在装机那一步就已经决定了,后面对抗的成本远高于当初多花二十分钟。

5.1 安装顺序决定了你后面少踩多少坑

我现在的固定顺序是:先装 Visual Studio(勾选完整游戏开发工作负载和对应版本的 Windows SDK),再装 Epic Games Launcher,最后通过 Launcher 装引擎。这个顺序的原因是 Launcher 在安装引擎时会去检测本机的 VS 环境,如果检测到完整的工具链,它会自动做一些配置关联;反过来先装引擎再补 VS,有些关联需要手动触发。

另外强烈建议的一件事:在 VS 的安装器里把自动更新关掉。这不是因为新版本不好,而是因为 UE4 对 VS 版本有明确区间要求,一个自动更新就可能把你从"能用"推到"不能用"。真要升级,先查兼容表,再决定升不升。团队协作时这一点更重要,大家的 VS 版本不一致会导致"我这能编他那不能编"的经典问题。

引擎版本也建议固定。Epic Games Launcher 里可以同时保留多个引擎版本,我一般会留一个主力版本加一个备用版本,主力版本用来做项目,备用版本用来做兼容性验证。切换引擎版本时,项目目录一定要重新生成工程文件,不能直接拿旧的.sln用。

5.2 几个让我卡了一整天的经典案例

说两个真实案例,都是那种"看起来完全不该出问题"的情况。

第一个是EngineAssociation的坑。有一个项目是从同事那拷贝过来的,我这边打开一直报生成失败。查了半天工具链都正常,最后发现.uproject文件里的EngineAssociation字段写的是一个 GUID,而不是版本号。这个 GUID 对应的是源码编译的引擎,在没有那台机器对应注册表项的情况下,UBT 根本不知道该用哪个引擎来生成工程文件。解决办法是把字段改成 Launcher 安装的版本号,比如"4.27",或者在注册表的HKEY_CURRENT_USER\SOFTWARE\Epic Games\Unreal Engine\Builds里补上 GUID 到引擎路径的映射。这个坑的迷惑性在于,报错信息跟工具链问题长得一模一样。

第二个是 UnrealVersionSelector 没注册。表现是右键.uproject根本没有"Generate Visual Studio project files"这个菜单项,或者点了没反应。原因是这个组件没有正确注册到系统。手动修复的方式是运行引擎目录下Engine/Binaries/Win64/里的UnrealVersionSelector-Win64-Shipping.exe,加/register参数触发注册。注册完之后右键菜单会恢复,同时文件的关联图标也会正常显示。

这两个案例的共同点是:报错表现跟"缺工具链"高度相似,但根因完全不同。这也是为什么我一直强调先看日志——日志里的措辞差异是区分它们的关键线索。

5.3 团队项目的环境规范化建议

如果你是团队里负责搭环境的人,有几个习惯能让后面省很多事。

一是把环境要求写成文档,明确写清引擎版本、VS 版本、Windows SDK 版本,以及哪些组件必须勾选。文档里最好直接附上那条vswhere自查命令和期望的输出,新人自己跑一遍就知道装没装对,不用来问你。

二是在项目仓库里放一份环境检查脚本,用批处理或者 PowerShell 写都行,跑一遍自动检查 VS 版本、工具链组件、SDK 版本、磁盘空间,输出一份体检报告。这个东西投入产出比很高,写一次能用很久。

三是统一项目路径规范,比如约定所有项目都放在D:\UEProj\下,全英文、无空格、尽量短的目录名。这条看起来简单,但能消掉相当一部分路径相关的疑难杂症。

四是谨慎处理引擎的共享。有人为了省空间用符号链接共享引擎,理论上可行,但 UBT 在解析路径时对链接的处理并不总是符合预期,偶尔会出现探测结果不一致的情况。空间真的紧张,宁可多装一个引擎版本,也别在路径上做太多花样。

最后分享一个我自己的排查习惯:遇到这类问题时,先把日志里所有ERROR行抄到一个文本文件里,然后逐行去搜索。这个动作看起来笨,但比在搜索引擎里输入"UE4 生成C++项目失败"要精准得多——因为 UBT 的报错文本非常标准化,几乎每一句都能在引擎源码里找到对应的判断分支,那句报错就是你唯一的、也是最可靠的路标。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 21:01:24

LC-3机器语言指令集入门:从15条指令吃透CPU工作原理

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

作者头像 李华
网站建设 2026/9/16 21:01:21

Unity接入SDK全流程指南:从概念到真机调试

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

作者头像 李华
网站建设 2026/9/16 21:00:10

Python实训项目:Flask+MySQL点餐系统设计与事务实现

简介:一份面向Python实训、课程设计和毕业设计的点餐系统源码项目,完整包含前端页面、后端逻辑与数据库文件。代码注释清晰,新手也能快速读懂,作者标注为98分高分项目,导师评价较高,适合作为期末大作业或课…

作者头像 李华