恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

Godot 源码编译实战:SCons、模块裁剪与导出模板

  • 首页
  • 资讯中心
  • /
  • Godot 源码编译实战:SCons、模块裁剪与导出模板

相关资讯

x64dbg 入门指南:安装、使用与源码构建 Windows 开源二进制调试器 2026/9/18 1:35:45
多波束测深数据处理全解:误差溯源、参数调优与自动化流水线 2026/9/18 1:35:45
Windows OpenSSH SFTP 企业级部署与审计实战指南 2026/9/18 1:35:45

最新资讯

SQL Server Always On可用性组搭建实战:从环境准备到故障转移
SuBaseToolsBox:UE5编辑器效率提升开源工具箱
基于STM32的智能婴儿床系统设计与实现
Unreal动画框架全链路解析:AnimGraph求值、线程安全与性能优化
基于Vue3+Python的赛事发布与在线选座系统设计与实现
Storybook 中记录按钮点击事件的 CSF 写法:从 render 硬编码到 Args 驱动

今日推荐

2026年AI设计工具在PPT制作中的核心应用与评测
Matlab手写逻辑回归:从数学原理到多变量概率预测模型实现
高值医用耗材研报PDF:用Python完成字段抽取、清洗与趋势预测

本周热门

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化
Flutter应用改名全指南:从Android到iOS的配置与工具实践

本月精选

自研推理加速器Redwood:两周内实现PyTorch模型高效部署的实战教程
V4L2摄像头采集实战:从camera_client.rar到出图全流程解析
从“谁发明了钢琴键”到知识问答智能体:RAG与记忆工程实践

Godot 源码编译实战:SCons、模块裁剪与导出模板

发布时间:2026/9/18 1:35:45
Godot 源码编译实战:SCons、模块裁剪与导出模板 前阵子有人在群里问我Godot 官网不是有现成的安装包吗双击就能用为什么还要自己去 clone 仓库、装 SCons、敲一堆参数把源代码编译一遍这个问题我被问过不止一次每次我的回答都差不多——因为下载引擎和编译引擎源代码这两件事解决的根本不是同一个问题。前者解决的是我要用 Godot 做游戏后者解决的是我要让 Godot 按我的意思工作。这两件事的受众、成本和收益完全不一样。这篇就围绕 Godot 引擎从源码下载到本地编译这条完整链路把版本怎么选、仓库怎么拉、工具链怎么配、SCons 参数怎么读、报错怎么查一次说清楚。不管你是刚接触 Godot 想做个小项目的新手还是已经写过几个 Demo、开始琢磨导出自定义模板的老手都能在这篇里找到能直接抄的部分。我会尽量把每个参数背后的原因讲透而不是给你一条命令让你照抄——因为照抄的命令换一台机器、换一个版本很可能就跑不通了。1. 先想清楚你到底为什么要自己编译一份 Godot动手之前先花十分钟想明白动机比后面省下三小时排查报错要值。我见过太多人跟风编译结果编译出来了不知道拿来干嘛白白占了几十个 G 的磁盘和一个下午的时间。1.1 官方包和自编译包的分水岭在哪官方发布的 Godot 安装包本质上就是官方用他们那套构建流程编出来的编辑器二进制加一套导出模板。你得先弄清这两个东西是分开的编辑器是你平时打开、搭场景、写脚本的那个窗口程序导出模板是当你点导出项目时把游戏打包成 exe、apk、html 时用的那套预编译运行时。官方安装包会带着匹配版本的导出模板而你自己编译的时候这两样东西同样需要分别产出。所以自编译和官方包的差别可以从三个维度看。第一是可控性官方包是一刀切的所有模块都开着D3D12、Vulkan、OpenGL、各种物理引擎、WebRTC体积和依赖都是固定死的你自己编可以把用不上的东西全部关掉也可以把你自己写的 C 模块塞进去。第二是版本自由度官方包只发稳定版和几个候选版的二进制如果你要用某个刚合进 main 分支、还没发版的修复或者要回退到某个中间提交去复现一个 bug只能自己编。第三是调试能力带着调试符号的自编译引擎能在崩溃时给你一份像样的调用栈官方包给不了。反过来说如果你只是想做个 2D 小游戏、导出个 Windows 版本官方包绝对够用没有任何理由去编译源码。这不是高手才编译的鄙视链纯粹是需求匹配问题。1.2 三种典型动机对应的编译策略完全不同我大致把找我聊过的人分成三类他们的编译策略差别很大我整理成一张表你可以对号入座。动机类型典型诉求推荐做法预期耗时学习者想搞懂引擎怎么跑起来的看看源码结构只编targeteditor用默认模块不做任何裁剪首次 20 到 50 分钟功能定制者要把自研的 C 模块或第三方库接进引擎编编辑器加一套模板开始裁剪模块每轮增量编译 1 到 10 分钟问题排查者复现某个特定提交下的 bug或验证某个补丁用git bisect定位到提交dev_buildyes加调试符号视提交数量而定可能反复多轮第一类人的目标是跑通所以别去动任何参数一个默认命令就行跑通了再去读源码。第二类人最容易被模块裁剪坑到——你以为关掉某个模块没事结果编辑器起来之后发现某个功能灰了或者导出时直接报缺模板。第三类人拼的是耐心和脚本化能力建议把编译命令写成一个 shell 脚本或者批处理文件别每次手敲。1.3 先把成本算清楚再动手成本这块我直说。磁盘方面一个完整的 Godot 4 源码目录加上中间产物和最终二进制Windows 平台上大致要 8 到 15 GBLinux 和 macOS 会稍小一点但也在这个量级。如果你开了debug_symbolsyes又没有用 LTO符号文件会非常夸张单个 PDB 就能到几百 MB。时间方面第一次全量编译是最慢的之后改一到两个 cpp 文件的重编会快很多因为 SCons 会复用没变过的目标文件。CPU 核心数和内存决定了你能开多大的并行度这一点在后面的参数章节我会具体讲。最后还有一个隐形成本心智负担。编译环境是那种配好一次就再也忘不掉但配不好的时候能折腾你一下午的东西所以本文后面会重点处理这块。2. 下载源码版本、渠道和那些容易踩的坑环境没配好之前先把源码弄到手。这一步看起来最简单其实版本选错是后面所有痛苦的源头。2.1 稳定版、候选版和 main 分支分别适合谁Godot 的版本号形如4.3、4.4后面还会带一个状态标签。我的建议是按目的选而不是按越新越好选。**稳定版stable**对应 Git 上的版本标签比如4.3-stable。它的意思是这个点上的代码经过了一轮测试社区里绝大多数教程和第三方模块都是对着它写的。如果你是为了学习、为了给项目换引擎闭着眼睛选最新的稳定版。候选版rc和 beta 版是发版前的测试版本适合那些急着验证新特性、又能接受踩坑的人线上项目不要碰。main 分支是开发主干随时可能编译不过——这不是危言耸听主干上出现半天到一天的构建中断是常事因为作者合新功能的时候未必在三个平台上都验证过。我自己的习惯是学习用最新的稳定版标签要复现某个 issue就 checkout 到那个 issue 里提到的 commit只有在需要某个刚合进去的修复时才会去 main 上摘一个 commit 出来 cherry-pick。2.2 克隆仓库的两种方式与参数取舍最标准的做法就是git clone。仓库不小完整历史拉下来在网络一般的情况下要几分钟到十几分钟。如果你只是想要个能编译的源码不需要翻历史可以只拉最近的一次提交git clone --depth 1 --branch 4.3-stable https://github.com/godotengine/godot.git godot-4.3 cd godot-4.3--depth 1是浅克隆只拿最后一次提交能省掉大量历史和空间。代价是你没法在本地git log翻历史、没法git bisect、切分支的时候可能还得重新拉。所以我一般建议第一次学习用浅克隆够用如果你确定要长期跟着这个仓库折腾老老实实全量克隆后面省事。还有一种情况是从某个代码托管镜像上下载 zip 包。这种方式快但有两个坑一是 zip 包可能只打了部分目录thirdparty这种东西经常被为了减小体积给剔掉二是 zip 包没有 git 信息如果你后面想切版本就得重新下一遍。如果你只能拿到 zip下完先检查一下thirdparty目录是不是正常存在且有东西。2.3 thirdparty 目录与子模块不拉全就等于白下这里插一句很多人误解的事。Godot 的第三方依赖比如物理引擎、图像解码、音频解码、字体渲染这些绝大多数是直接提交进仓库的也就是所谓的 vendored 依赖放在thirdparty/下面。它不像有些项目那样一大堆git submodule所以--recursive这个参数在 Godot 上通常不是必需的。但不需要递归子模块不等于目录可以缺。如果你从某些二手渠道拿到的源码包里thirdparty是空目录或者内容不全编译到一半就会出现找不到某某头文件的报错而且报错信息指向的位置往往离真正的问题很远非常误导人。所以拿到源码后的第一件事我建议是看一眼thirdparty目录的体量和misc/scripts/目录du -sh thirdparty ls misc/scriptsmisc/scripts/这个目录值得特别提一句。Godot 把一些平台特定的依赖获取脚本放在这里比如某些图形后端的 SDK 安装脚本、Android 相关的辅助脚本。如果你的构建在某个平台上抱怨缺某个第三方库先去这个目录翻一翻很可能官方已经写好了脚本只是没在文档里大声说。3. 三平台工具链准备一次讲透编译这件事九个报错里有七个是环境问题。这一节按平台拆开讲你要用哪个平台就只看哪一段。3.1 WindowsMSVC 还是 MinGWWindows 上有两条路。绝大多数人走的是MSVCVisual Studio 的编译器因为这是官方发版用的工具链兼容性最好。你需要装 Visual Studio 2019 或 2022 的 Build Tools安装时务必勾上使用 C 的桌面开发这个工作负载只装 IDE 不装 C 工具链是最常见的坑。装完之后最稳的启动方式是打开 Visual Studio 自带的x64 Native Tools Command Prompt在这个专用命令行里跑编译命令。这个终端的妙处是它在启动时就把cl.exe、link.exe的路径和一堆环境变量配好了你在普通 PowerShell 里跑报找不到 cl.exe进这里通常就好了。如果你非要用普通终端那就得先手动执行一次vcvars64.bat它的位置在 Visual Studio 安装目录下的VC\Auxiliary\Build里。另一条路是MinGW也就是 GCC 在 Windows 上的移植。它编译出来的二进制和 MSVC 生成的不兼容但如果你习惯 GCC 系或者需要链接某些只有 MinGW 版本预编译的库那就得走这条。用 MinGW 的时候必须指定前缀否则 SCons 找不到工具链scons platformwindows use_mingwyes mingw_prefixC:/mingw64 -j8注意MSVC 和 MinGW 的产物不要混用尤其是导出模板。编辑器用 MSVC 编的模板用 MinGW 编的运行时会出各种莫名其妙的问题而且很难查。同一套构建里保持一致。3.2 Linux依赖包一次装齐Linux 上的体验其实是最好的因为包管理器能把依赖一次解决。以 Debian 和 Ubuntu 系为例下面这串是我常用的清单包含编译工具、X11 相关开发头文件、音频、输入设备、字体这些sudo apt update sudo apt install -y build-essential scons pkg-config git python3 \ libx11-dev libxcursor-dev libxinerama-dev libxi-dev libxrandr-dev \ libgl1-mesa-dev libglu1-mesa-dev libfontconfig1-dev libdbus-1-dev \ libudev-dev libasound2-dev libpulse-dev libspeechd-dev libwayland-dev这里面最容易被漏掉的是libxi-dev和libxinerama-dev这类看着不起眼的 X11 扩展库漏了之后报错是链接阶段的未定义符号新手看到那一屏undefined reference基本就懵了。另外pkg-config一定要装很多依赖的探测是靠它做的。如果你的发行版不是 Debian 系包名会不一样但对应的能力是一一对应的X11 开发头文件、OpenGL 开发头文件、字体配置、D-Bus、udev、ALSA、PulseAudio。缺哪个补哪个报错信息里一般会直接点名。3.3 macOSXcode 命令行工具与架构选择macOS 上先装 Xcode Command Line Tools一条命令的事xcode-select --install装完就有 clang 和 SDK 了。macOS 平台的编译还有个特殊之处是通用二进制universal binary也就是把 Intel 的 x86_64 和 Apple Silicon 的 arm64 打包进同一个文件。Godot 的构建系统对此有支持但通用二进制意味着两个架构各编一遍再合并时间基本翻倍。如果你只是自己用而且确定只在一种架构的机器上跑那就单独指定架构能省一半时间。只有当你需要把编辑器发给别人、对方可能是另一种芯片时才值得做通用包。还有一个绕不开的点macOS 上跑 Vulkan 是通过 MoltenVK 转译的这些预编译依赖通常在仓库里或者由misc/scripts/下的脚本负责拉取。如果你在链接阶段看到一堆vk开头的符号找不到先回头确认源码目录是不是完整的再去看那个脚本目录。3.4 Python 与 SCons跨平台共用的那一层三个平台有一个共同点Godot 的构建系统是SCons而 SCons 是 Python 写的。所以不管你用什么系统机器上都得有 Python 3而且版本别太老。Godot 4 系要求 Python 3.6 以上但为了少踩坑我建议直接上 3.8 或更高因为新版 SCons 对 Python 版本有要求。装 SCons 最省事的方式是 pippython3 -m pip install sconsWindows 上用python -m pip install scons。装完之后scons --version验证一下能打出版本号就说明这层通了。如果你的环境里有多个 Python注意pip和python是不是指向同一个解释器这是 Windows 上非常高频的一个坑——pip install scons装到了 3.9结果python其实是 3.11然后就是经典的scons 不是内部或外部命令。注意不要用系统包管理器装的老版本 SCons。有些发行版的仓库里躺着的 SCons 版本比 Godot 要求的低症状是执行构建时脚本报语法错误或某些参数不被识别看着完全不像环境问题很容易往源码上怀疑。用 pip 装好升级。4. SCons 编译参数逐个拆解环境通了重头戏来了。Godot 的 SCons 参数很多但真正常用的就那么十几个。我按先定目标再调性能后做裁剪的顺序讲。4.1 为什么 Godot 选 SCons 而不是 CMake这个问题我被问过很多次答案其实挺现实的。Godot 支持的目标组合非常多三个桌面平台、Android、iOS、Web每个平台又有编辑器、调试模板、发布模板三种目标再叠加不同的架构和几十个可裁剪的模块。SCons 是 Python 写的配置逻辑就是一坨普通的 Python 代码写条件分支、循环、动态生成目标列表都很自然。相比之下 CMake 的 DSL 在处理这种组合爆炸的场景时要别扭不少。代价也很明显SCons 的速度比 Ninja 这类工具慢因为它在构建前要做一次完整的依赖扫描。这也就是为什么 Godot 的构建时间显得有点长而且第一次构建特别慢。好消息是它做了增量改一两个文件之后的重编很快。4.2 target、platform、arch 这三个参数先把目标定死这三个参数决定了你要编出什么东西必须一开始就定死后面所有参数都围绕它们转。platform是目标平台。桌面端常见取值是windows、linuxbsd、macos。注意 Linux 用的是linuxbsd而不是linux这个名字从 3.5 时代改过来之后一直沿用很多老教程里写的还是x11照抄会直接报平台未知。移动端是android、ios网页是web。target决定产物类型。Godot 4 里三个取值editor是带编辑器的可执行文件你平时开发用的就是它template_debug是调试版导出模板带调试符号、能连调试器但性能差template_release是发布版模板做了优化给玩家用的就是它。在 Godot 3 里这套命名不一样是release_debug配toolsyes和release配toolsno看老教程的时候特别容易混。arch是架构常见的是x86_64、x86_32、arm64、arm32。桌面机基本就是x86_64Apple Silicon 的 Mac 是arm64安卓那边的组合多一些。一个最朴素的编辑器构建命令长这样scons platformlinuxbsd targeteditor archx86_64 -j8Windows 上把平台换成windows编译产物会带.exe。macOS 换成macos。4.3 性能与体积相关的参数production、lto、dev_build、debug_symbols目标定完之后接下来是权衡性能和体积的一组参数我整理成表格方便对照。参数取值作用什么时候用productionyes/no一套面向发布的优化组合开关编正式发布模板时开ltonone/thin/full链接时优化跨文件内联发布版建议 thin 或 fulldev_buildyes/no开发构建开启额外断言和检查调试引擎本身时开debug_symbolsyes/no是否生成调试符号需要看崩溃栈时开use_llvmyes/no用 clang/LLVM 而不是默认编译器Linux 上想用 clang 时开strict_warningsyes/no把警告当错误提交补丁前自查用这里有几个坑必须说。LTO 和内存是死对头尤其是ltofull链接器会尝试把整个程序的所有目标文件一起优化内存占用可能是普通链接的好几倍。8 GB 内存的机器开ltofull加高并行度基本就是一个字卡死。我的建议是内存 16 GB 以下就别碰 full用 thin。dev_build 和 production 互相打架。dev_buildyes会打开大量运行时检查性能会掉但排查引擎自身 bug 时非常有用因为它能在问题发生的第一现场就报出来。而productionyes反过来是把性能拉满、调试信息压到最低。你要么在开发要么在发版别两个一起开。debug_symbols 和体积的关系也很直接。开了之后二进制会膨胀好几倍Windows 上还会额外生成 PDB 文件。如果你编的编辑器要分发给团队里的美术同学记得别把符号带上不然几个 G 的包能把人吓到。4.4 模块裁剪disable_3d 与 module_*_enabledGodot 的模块化程度很高这是它相比很多引擎的一大优势。构建系统里有一批开关命名规律是module_模块名_enabled比如某个模块叫mything那开关就是module_mything_enabledno。对做 2D 项目的人来说最有价值的一个开关是disable_3dyes。它会砍掉 3D 渲染和 3D 物理相关的部分编出来的体积能小一大截链接和编译时间也短。当然代价是你的项目里再也用不了 3D 节点这个必须在项目立项时就确定中途改成本很高。还有几个常用的裁剪方向音频后端、WebRTC、某些图片格式支持、脚本语言的某些部分。原则是按需裁别提前裁。我见过有人一上来把能关的全关了结果导出的时候发现某个功能不可用回头查了半天才发现是自己关的。想确认某个模块开没开最简单的办法是搜构建输出里的模块列表或者直接在仓库里看modules/目录下各个模块的config.py。4.5 用 scons --help 自查比看任何教程都准这条是我最想强调的。SCons 支持把项目里定义的所有构建变量打印出来scons --help它会输出一长串参数说明包括每个参数的默认值、取值范围、以及这个版本里到底存在哪些开关。这比看任何教程都靠谱因为教程可能是对着 4.0 写的而你手上是 4.3参数名可能已经变了。我的习惯是每次拿一个新版本先跑一遍scons --help把它存成一个文本文件放在旁边编译报未知参数的时候就去这个文件里搜。5. 完整编译实录从零到可运行的编辑器前面都是准备这一节是动手。我按平台给你完整流程包括我在实际机器上观察到的现象。5.1 Windows 实录一次编辑器的完整构建先确认你在 x64 Native Tools Command Prompt 里然后进到源码根目录。第一步不是急着编译是先看一眼目录结构确认源码完整cd godot-4.3 dir python --version scons --version确认没问题之后跑编辑器构建。第一次我建议把并行度设成核心数的七成左右别一上来就拉满因为编译前期内存占用高拉满容易把机器拖到无响应scons platformwindows targeteditor archx86_64 -j6接下来就是等。你会看到 SCons 先扫描依赖、然后一行行编译命令刷屏。这个过程在 Ryzen 7 级别的机器上大概 15 到 30 分钟。中间如果出现红色的error整个过程会停在那里你需要往上翻找到第一个 error后面那几十行报错基本都是它的连锁反应——这一点非常重要永远只看第一个错误。编译成功后产物在bin目录下名字类似godot.windows.editor.x86_64.exe。双击运行你能看到一个和官方版一模一样的编辑器窗口只不过它是你自己编的。第一次启动看到这个画面那个感觉还是挺爽的。5.2 Linux 实录依赖装齐之后其实最顺Linux 上的流程和 Windows 几乎一样只是命令里的平台名换掉scons platformlinuxbsd targeteditor archx86_64 -j$(nproc)$(nproc)会自动取到 CPU 核心数。Linux 上我一般会拉满因为内存管理相对宽松实在不行系统会 OOM 把进程杀掉而不是整机卡死——当然这不是什么好体验第一次还是建议-j后面填一个保守点的数字。产物在bin/godot.linuxbsd.editor.x86_64直接./bin/godot.linuxbsd.editor.x86_64运行。如果你的发行版比较新、桌面环境是 Wayland可能会遇到窗口相关的兼容问题这时候可以在启动时指定图形后端试试或者先切回 X11 会话。一个实测经验Linux 上第一次构建完之后如果你只是改modules/下面自己写的代码重编通常在一分钟以内因为引擎主体没动。这个增量效率是这套构建系统最让人舒服的地方。5.3 macOS 与增量编译macOS 上scons platformmacos targeteditor archarm64 -j8如果你要通用包把arch去掉或者按构建系统支持的方式指定多架构让 SCons 自己合并。代价是时间翻倍前面提过。关于增量编译这里有几个实操心得。第一改了头文件会触发大面积重编。C 项目的通病头文件一改所有 include 它的 cpp 都要重新编译Godot 里几个核心头文件被引用的范围很广改一下可能要重编上千个文件。所以调试引擎的时候尽量改 cpp 而不是头文件。第二用好 ccache。如果你的系统装了 ccache可以在编译时把编译器前面挂上它命中缓存的时候单个文件几乎是瞬间完成。挂载方式各版本略有不同有的可以直接用 SCons 变量指定有的得通过环境变量传CC和CXX具体看你手上版本的scons --help输出。我换分支频繁的时候基本都开。第三切换 target 的时候会重新编一遍。因为editor和template_release是两套不同的产物中间产物不共享这是正常的不是出错。5.4 编译导出模板与打包成 tpz编辑器编出来了但导出项目的时候你会发现——没有模板。导出模板需要单独编scons platformwindows targettemplate_debug archx86_64 -j6 scons platformwindows targettemplate_release archx86_64 -j6编完之后产物是bin/下面几个文件名里带template_debug和template_release的文件。但这些文件名不能直接用编辑器认的是一套固定的命名。这里我给你一个比查文档更省事的办法去官网下载一份和你源码版本对应的官方导出模板包.tpz文件它本质上就是个 zip解压开你会看到一个templates/目录和一个version.txt。照抄里面的文件命名和目录结构把你自己的产物改名放进去就完事了。这招能避免你在命名规则上反复试错。.tpz的结构大致是这样templates/ linux_debug.x86_64 linux_release.x86_64 windows_debug_x86_64.exe windows_release_x86_64.exe ... version.txtversion.txt里写的是版本字符串必须和你的引擎版本一个字符都不差。比如你编的是 4.3 稳定版那里面就得是4.3.stable这种形式。差一个后缀编辑器就认为这个模板包不匹配直接拒绝安装或者安装后不可用而且给的提示很含糊这是非常高频的一个坑。打包就是普通的 zipzip -r godot-4.3-custom.tpz templates version.txt然后在编辑器的菜单里找到管理导出模板选择从文件安装指向这个 tpz。装完之后编辑器会用这个版本号作为目录名把模板放到用户数据目录下的export_templates里。Windows 上是%APPDATA%\Godot\export_templates\Linux 上是~/.local/share/godot/export_templates/macOS 上是~/Library/Application Support/Godot/export_templates/。注意如果你只是想用自编译模板本机测试也可以直接在导出设置里手动指定模板路径不一定要走 tpz 这条路。但 tpz 的好处是干净、可复用、能发给同事长期还是建议打成包。5.5 编译产物验证清单拿到产物之后别急着用花两分钟验证一下能挡掉后面一大堆怎么这么奇怪的问题。我一般按这张表过一遍检查项怎么查期望结果版本字符串命令行加--version运行打印出你编的那个版本号编辑器能否启动直接双击或命令行运行正常出窗口无报错弹窗图形后端启动日志里看渲染后端和你的编译参数一致模块是否生效起个测试项目建对应节点关掉的模块确实用不了开着的能用模板匹配编辑器里管理导出模板版本号能对上不报不匹配导出能否成功拿个空项目导一次能产出可执行文件并正常运行最后一项最有价值。很多时候模板命名或者版本号有问题在编辑器里看不出来一导出就露馅。所以我建议编完模板之后立刻拿一个最简单的空项目导一次跑起来看到窗口才算真正完成。6. 报错排查手册那些让人怀疑人生的瞬间编译源码最耗时的部分从来不是敲命令是报错。这一节我把常见的几类整理出来附上排查思路。6.1 MSB6006 与 cmd.exe 退出代码 3 到底在说什么Windows 上你可能会看到这种报错error MSB6006: cmd.exe 已退出代码为 3。这个报错特别气人因为它什么都没说清楚。原因在于这是一条外层构建工具在传达内层命令失败的消息。那个cmd.exe只是被派去执行某个自定义命令的壳真正失败的是壳里面跑的东西。代码 3 只是个笼统的失败码不含任何诊断信息。所以排查方法只有一个往上翻找到这条 MSB6006 之前最后一条真正带有意义的报错。可能是某个 Python 脚本抛了异常可能是 SCons 返回了非零退出码也可能是某个工具根本没找到。找到那条错误的真实内容问题就解决了一半。我遇到过一次往上翻了三百多行发现是 Python 脚本里读一个文件读不到再往上查发现是那个文件在浅克隆的时候没拉下来。整条链上每一层都只是转述最后一层才是真相。6.2 链接阶段的未定义符号undefined reference to ...或者 Windows 上的LNK2019是第二大类。这类报错的特征是编译阶段全过了到链接才炸说明某个函数被声明了但没被定义。常见原因有三个。第一系统库没装。Linux 上忘装某个-dev包对应功能就会缺符号报错里通常会出现库名相关的提示比如和 X 相关的、和音频相关的、和字体相关的。第二模块裁剪裁过头。你关了某个模块但代码里还有地方引用它这时候就会缺符号。这种情况只能把模块开回来或者深入改代码。第三源码目录不完整。前面说的thirdparty缺文件就是这一类症状是一堆看着毫不相关的符号找不到。排查建议把报错里提到的第一个符号名复制出来在源码目录里 grep 一下看看它属于哪个模块或者哪个第三方库路径基本就指向问题了。6.3 内存、并行度和 LTO 的三角关系这一类问题不会给你漂亮的报错而是机器变卡、编译进程被杀、或者报一个编译器内部错误。典型症状是编译器报内存不足或者系统直接 OOM。原因通常是三件事叠加开了 LTO、并行度拉满、内存不够。这三个变量是相乘的关系不是相加。8 GB 内存加-j16加ltofull等于自杀。我的处理顺序是这样的先把-j降到核心数的一半甚至更低看能不能过如果还不行把lto从full降到thin或者干脆关掉最后才考虑加内存或者加交换空间。用交换空间硬扛是个办法但会慢到让你怀疑人生只在编发布包的时候偶尔为之。6.4 改了源码之后的重编姿势很多人改完引擎源码习惯性把整个bin和中间产物删掉重新编这是极大的浪费。SCons 的增量是靠时间戳和依赖图做的正常情况你只需要重新跑一次同样的命令它自己会算出哪些文件要重编。但有几个情况例外。第一你改了构建脚本本身比如SConstruct、SCsub、config.py这类文件那依赖关系会变建议还是重新跑一遍完整命令让它重新扫描。第二你换了编译参数比如从targeteditor换成template_release这是完全不同的产物集合等于重新编。第三你在不同分支之间来回切切分支会改动大量文件的时间戳可能触发大面积重编这时候我一般会干脆清掉中间产物重来心理上更踏实。至于怎么清看构建系统提供的清理目标或者手动删掉存放中间文件的目录通常叫bin和thirdparty之外的那些.o、.obj所在位置。删之前确认一下没有别的东西放在里面。6.5 问题速查表把上面这些整合成一张速查表出问题的时候先对着看症状最可能的原因处理动作提示找不到sconsPython 与 pip 不是同一个环境用python -m pip install scons重装提示找不到cl.exe不在 VS 专用命令行里进 x64 Native Tools Command Prompt平台名报未知用了老教程里的x11换成linuxbsd未知构建参数参数在你这版里不存在或改了名跑scons --help核对一屏undefined reference系统开发库没装全按报错里的库名补装对应-dev包编译器内部错误内存不足常见于 LTO 加高并行降-j降lto等级MSB6006 代码 3外层工具转述了内层失败往上翻找第一条真实错误编辑器起不来图形后端或运行库不匹配看启动日志第一行错误模板装不上version.txt或文件名不匹配对照官方 tpz 逐一核对导出后程序崩溃编辑器与模板版本不一致确认两者来自同一次构建7. 编完之后裁剪、自定义模块与长期维护到这一步你已经有了一个能跑的自编译引擎。如果你只是学习者其实可以收工了回去读源码就行。但如果你有定制需求这一节才是真正的开始。7.1 自定义模块的最小骨架把自研代码接进引擎标准做法是放一个模块目录到modules/下面。一个最小模块通常包括三个东西构建配置、构建脚本、注册代码。构建配置是一个config.py它至少要有can_build和configure两个函数前者告诉构建系统这个模块在哪些平台上能编后者做参数调整# modules/my_module/config.py def can_build(env, platform): return platform in [windows, linuxbsd, macos] def configure(env): pass构建脚本是一个SCsub负责把源文件加进构建目标# modules/my_module/SCsub Import(env) env.add_source_files(env.modules_sources, *.cpp)最后是注册文件register_types.cpp和register_types.h它们的作用是在引擎初始化的合适时机把你的类注册进去这样 GDScript 里就能通过你给的名字访问到。具体哪个初始化级别、注册哪些东西取决于你的类继承自什么这部分建议直接找一个功能相近的内置模块对照着抄骨架比看文档快得多。注意自定义模块的代码会跟着编辑器一起编所以任何编译错误都会卡住整个构建。写模块的时候先用最简单的空实现跑通一次完整编译确认骨架没问题再往里填功能。这样出问题时你能确定是自己的实现问题还是集成方式问题。7.2 让自编译引擎和现有项目共存一个很现实的问题你编了一个定制的编辑器但团队其他人用的是官方版项目文件来回传会不会出问题大部分情况下不会因为 Godot 的项目文件格式是文本版本兼容性做得还算好。但有两个雷区要避开。第一是版本号。低版本编辑器打开高版本项目会警告甚至拒开所以你的自编译引擎最好基于团队用的同一个版本。第二是自定义的功能。如果你的模块引入了新的资源类型那项目文件里就会引用这个类型别人用官方编辑器打开会因为找不到类型而报错。这种情况要么让所有人都换你的编辑器要么把自定义资源存成标准格式。我自己的做法是给自编译引擎单独建一个工作目录项目里用相对路径引用资源和脚本基座版本号和团队保持一致。这样切换引擎只要换可执行文件那一行不会波及项目本身。7.3 我个人踩过的几个坑最后分享几个实打实的教训都是文档里不会写、但能省你半天时间的。第一个坑是浅克隆加上切分支。我一开始图快用了--depth 1后来想切到另一个 tag 去验证一个功能Git 直接告诉我历史不足只能重新克隆一份完整的。所以如果你预计要来回切版本一开始就全量克隆别省那几分钟。第二个坑是改了头文件之后没意识到重编的规模。有一次我在一个核心头文件里加了一行日志声明结果触发了上千个文件重编等了半个多小时。后来我学乖了调试的时候尽量用 cpp 里的局部改动实在要改头文件就一次改完再编。第三个坑是导出模板的版本号。我第一次编模板的时候把版本号写成了我看到的不带后缀的形式结果编辑器死活不认这个模板包。折腾了一个多小时最后解压了一份官方 tpz 对比发现人家写的是带状态后缀的完整字符串。这个教训值一个先看官方怎么做的。第四个坑是并行度开太大。我一开始觉得-j越大越好直接拉到 CPU 线程数结果内存瞬间打满机器卡到连鼠标都动不了只能强杀。后来固定用核心数的一半到七成稳定得多。第五个坑是把中间产物和源码放在同一个需要同步的目录里。如果你的源码目录被某种同步工具盯着编译过程产生的大量临时文件会让同步疯掉而且可能反过来锁住文件导致编译失败。构建目录和同步目录一定要分开。这五个坑现在看都很基础但每一个我都实实在在花过时间。如果你正准备第一次编译 Godot 源码把这五条先记在心里能省下的时间足够你多读两章渲染管线的代码了。

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号