1. 拆解 OpenClaw 的安装需求:到底需要哪些依赖
1.1 项目构成与依赖关系
先说这次折腾的起因。单位有一台 Windows 机器,外网访问基本被策略锁死,普通 Ubuntu 源根本连不上,apt update一跑就是超时。而我偏偏要在上面跑 OpenClaw——这个开源项目把 90 年代那款经典横版动作游戏做了完全重写,引擎用 C++ 写成,构建方式也很标准:CMake 生成工程文件,然后用 Make 或者 Ninja 编译。听起来不难,难的是它拉依赖的那一整套家当。
编译 OpenClaw 至少需要完整的 C++ 工具链、SDL2 开发库、libpng 开发库,以及 pkg-config 和 CMake。我这里说的是编译阶段,不是运行阶段。运行阶段只需要 SDL2 的运行库、libpng 的运行库、OpenGL/Mesa 的软件渲染驱动,以及一套原版游戏的数据资源。如果你只想玩一下,编译工具链可以不要;但既然是用源码构建,离线环境下最省事的做法就是一次性把所有依赖全部打包,连编译链带运行库一锅端。
这里有一个新手很容易搞混的点:Ubuntu 里“带 -dev 后缀的包”和“不带后缀的包”是两件事。libsdl2-2.0-0是运行库,只负责让游戏跑起来;libsdl2-dev是开发头文件和链接库,编译 OpenClaw 时 find_package 找的是它。离线准备依赖时,dev 包和运行库都得拿,不能只拿一个。我之前就试过只准备运行库,结果编译到一半直接报fatal error: SDL.h: No such file or directory,又得回在线机器补包,来回折腾了好几趟。
1.2 为什么最终选择 WSL2 + Ubuntu 24.04
有人可能会问,Windows 上编译一个开源引擎,为什么不直接在 Windows 上用 Visual Studio 或者 MinGW,非要绕一圈 WSL?答案其实挺现实:OpenClaw 这类偏复古的游戏引擎,开发者的首选构建链路就是 Linux。Windows 侧当然也能编,但要处理 C++ 运行时、SDL 在 Windows 上的加载方式、资源路径分隔符等等,坑比 Linux 多一个数量级。再加上我们的目标环境离线,Windows 下根本拉不了 vcpkg 依赖,所以用 Linux 子系统反而是最短路径。
接下来是选择问题:虚拟机、双系统、WSL2 三条路,我全考虑过。对比如下。
| 方案 | 启动速度 | 图形界面 | Windows 文件互访 | 资源占用 | 适合离线构建 |
|---|---|---|---|---|---|
| 虚拟机 | 慢,冷启动要等 | 需要配置显卡透传 | 通常走共享文件夹 | 高,动辄几 GB 内存 | 可以,但笨重 |
| 双系统 | 中等,切换需重启 | 原生 GPU 驱动,最好 | 基本靠 U 盘/网络 | 中 | 可以,但耽误用 Windows |
| WSL2 | 秒级启动 | WSLg 直接弹窗口 | 直接访问 /mnt/c | 低,按需分配内存 | 非常适合 |
WSL2 最打动我的其实是两个点:一是启动快,不用开虚拟机软件等半天;二是它自带的轻量型图形转发。较新版本的 WSL 会默认启用 WSLg,Linux 程序里只要弹窗口,Windows 桌面直接就能显示,不需要额外装 Vnc 或者 X 服务器。对 OpenClaw 这种需要图形窗口的引擎来说,这等同于在 Windows 里开了个无缝的 Linux 环境。再加上 WSL 的根文件系统是一块 ext4 虚拟磁盘,在内部操作时完全是原生 Linux 行为,不会踩到 Windows 路径和权限的问题。
至于为什么选 Ubuntu 24.04,而不是 22.04 或者 Debian 12,原因更简单:OpenClaw 的社区 CI 和文档普遍基于较新的 Ubuntu LTS,24.04 的软件源里有足够新的 SDL2、CMake 和 GCC 版本,编译时能少改不少代码。重要的是,不管选哪个版本,离线准备依赖时都必须锁死同一个版本,不能在线机用 22.04 拉包,目标机用 24.04 去装,否则 ABI 不匹配的问题会让你怀疑人生。
1.3 离线安装的整体工作流
整体流程可以压缩成四个阶段,先在线后离线,逻辑非常清晰。
- 在能联网的机器上准备编译 OpenClaw 所需的全部
.deb包,以及项目源码。 - 在目标 Windows 机器上开启 WSL2 并安装 Ubuntu 24.04,完成账号和基础配置。
- 把
.deb包拷贝进 WSL 内部,用离线仓库的方式让 apt 接管依赖解析,完成工具链和依赖安装。 - 拷贝源码、编译 OpenClaw、放置游戏资源、启动图形界面排错。
按这个顺序走下来,离线限制对整个安装过程的影响会被压到最小。真正耗时间的其实不是安装动作,而是后面编译阶段遇到各种奇奇怪怪的报错后的排查。这篇文章宁可多写一点细节,让后来的人少走弯路。
2. 在联网机器上备好全部依赖包
2.1 锁定 Ubuntu 版本与架构
离线安装的第一原则:在线机器和离线机器的系统版本必须一致。我在这一步吃过亏,当时图省事,拿一台 Ubuntu 22.04 的机器拉了依赖,结果 24.04 目标机上有一半包装不上,报的错还很隐蔽,什么“依赖关系不满足”“版本不匹配”,实际上就是因为库的 ABI 变了。与其事后排查,不如事前就把版本锁死。
具体操作是在在线机器上执行:
cat /etc/os-release记下 VERSION_ID,比如24.04。如果在线机器是 24.04,目标机也是 24.04,下面的流程才成立。另外还要确认架构,现在绝大多数 PC 都是amd64,但少数 ARM 设备是arm64,这两者的.deb包互不通用,用arch命令确认一次最稳。
如果在线机版本和目标机不完全一样,也不要心存侥幸。最好重新找一台匹配版本的机器来拉包,或者使用 Docker 拉一个对应版本的镜像来做离线包准备。我当时是用了一台云主机,起了个 Ubuntu 24.04 容器,在容器里把包全部下载好再压出来,效果很好。
2.2 离线包清单与下载命令
OpenClaw 的依赖列表需要覆盖三层:工具链、构建系统、开发库。我个人建议至少准备以下包。
| 包名 | 用途 | 说明 |
|---|---|---|
| build-essential | gcc/g++/make 基础工具链 | 必带 |
| cmake | 构建系统 | 必带 |
| pkg-config | 依赖查找辅助工具 | 编译时经常被隐式调用 |
| libsdl2-dev | SDL2 开发头文件 | 编译 OpenClaw 必须 |
| libsdl2-2.0-0 | SDL2 运行库 | 运行 OpenClaw 必须 |
| libsdl2-image-dev | SDL2 图像扩展开发库 | 部分分支依赖 |
| libsdl2-image-2.0-0 | SDL2 图像扩展运行库 | 对应运行库 |
| libpng-dev | PNG 解码开发库 | 引擎读取素材必须 |
| libpng16-16t64 | PNG 运行库 | 对应运行库 |
| zlib1g-dev | 压缩库开发头文件 | 很多依赖链会用到 |
这不是什么玄学清单,而是从 OpenClaw 的 CMakeLists 里能看到的那几个关键 find_package 反推出来的。最坏情况下多带几个 deb 也就是多占几十 MB 空间,不会有副作用;少带一个则可能要整体返工。宁可多带不可少带,是我离线拉包的原则。
带音频支持的话,也建议准备libasound2-dev和libpulse-dev。OpenClaw 的 SDL 后端默认会尝试 PulseAudio 和 ALSA,没有相关库虽然也能编译,但运行时会找不到声音设备,体验差很多。
2.3 三种拉包方式对比
在线机器上拉包有三种常见方法,我按推荐程度排个序。
第一种是apt-get install --download-only,它会把指定包和依赖全部下载到本机缓存目录,省去手动分析依赖树的功夫。命令如下:
sudo apt-get update sudo apt-get install --download-only build-essential cmake pkg-config \ libsdl2-dev libsdl2-image-dev libpng-dev \ libasound2-dev libpulse-dev ls /var/cache/apt/archives/*.deb下载完成后,/var/cache/apt/archives目录里会有几十个.deb文件,直接全部拷贝走就行。这个方式适合安装包数量较多的场景,因为我们需要的并不只是顶层包,还有 build-essential 底下那一大串依赖,一个命令全搞定。
第二种是apt-get download,它只下载给定的包本身,不自动拉依赖。适合你已经知道目标机上缺哪几个包的情况,用来临时补漏:
apt-get download libsdl2-dev如果你想靠它准备整个环境,那还得配合apt-cache depends一层层递归分析依赖,非常浪费时间,不推荐。
第三种是apt-offline,专门为离线环境设计的工具。它的思路是先在离线机上生成一个需求签名文件,然后把这个文件带到在线机器上,在线机按签名下载完所有包,再带回离线机安装。这套流程看起来很严谨,但多了一个在离线机上安装 apt-offline 本身的前置条件,其实挺矛盾的。我更愿意把它当作理解配置文件的一种参考,而不是实际首选。
拉包过程中如果遇到源连接不稳定,反复重试也没关系,慢一点总比拿错包强。全部下载完后,统一用dpkg-deb -I扫一遍包信息,确认架构和目标版本是 amd64。
2.4 源码的离线搬运方案
源码和依赖包一样,也得想好搬运方式。OpenClaw 通常用 Git 发行,离线场景下最优雅的方案是git bundle,它能把整个仓库历史打包成单个文件,到目标机上再还原成完整仓库:
git clone https://example.com/OpenClaw.git OpenClaw git -C OpenClaw bundle create openclaw.bundle --all把生成的openclaw.bundle拷贝到离线机器后,执行:
git clone openclaw.bundle OpenClaw cd OpenClaw git checkout origin/HEAD这样得到的是完整的版本历史,后续想切分支、看提交记录都没有问题,不是简单解压一个源码压缩包能比的。如果目标机器对 Git 仓库的完整性没那么高要求,直接tar czf打包一个源码目录也行,但我会更喜欢 bundle,因为它天然带校验,不怕拷贝损坏。
3. WSL Ubuntu 24.04 离线初始化实操
3.1 Windows 侧与 WSL 基础配置
这一节分两种情况。如果 Windows 本身能联网,直接在 PowerShell 里敲:
wsl --install -d Ubuntu-24.04会同时把 WSL 内核和 Ubuntu 发行版装上。装完以后执行wsl --version确认 WSL2 内核版本,然后第一次启动,创建一个普通用户并设置 sudo 密码。
如果 Windows 侧同样是隔离环境,wsl --install就不可用了。需要在能联网的机器上手动获取 WSL2 内核安装包和 Ubuntu 24.04 的 rootfs tar 包,拷到目标 Windows 机上。先在 PowerShell 里手动启用 WSL 功能:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart重启后用 rootfs tar 导入发行版:
wsl --import Ubuntu-24.04 C:\wsl\Ubuntu2404 ubuntu2404_rootfs.tar --version 2这里的ubuntu2404_rootfs.tar就是在线机器上提前准备的 Ubuntu 24.04 根文件系统。这种导入方式最适合离线环境,因为它完全不依赖 Microsoft Store 和应用下载通道。缺点是第一次启动不会提示你创建用户,需要登录默认 root 后手动添加一个日常使用的普通用户。
WSL 底层配置还需要注意两点。一是默认版本要锁定为 2,不然图形界面性能和文件挂载行为会退化。二是如果发现 Windows 防火墙莫名其妙拦截了 WSL 内部的网络访问,通常需要在 Windows 安全中心的“允许应用通过防火墙”里放行vmmem和 WSL 相关的虚拟网络服务。虽然 WSL 内部是 NAT 网络,但偶尔也会遇到外部手段触发的连接问题。
3.2 把离线包放进 WSL 的正确姿势
很多人习惯把下载的.deb放在 Windows 桌面上,进 WSL 后直接在/mnt/c/Users/xxx/Desktop路径下操作。这能跑,但我不推荐,原因是 /mnt 目录走的是 9P 协议,文件复制和权限表现和原生 Linux 文件系统很不一样。dpkg在 9P 文件系统上创建符号链接、保留权限时会出现诡异的问题,有时候明明文件在,偏偏报找不到,有时候权限位变了,执行不下去。
正确的做法非常简单:先把全部离线文件拷到 WSL 原生文件系统里,再开始安装。
mkdir -p ~/debs ~/src cp /mnt/c/Users/你的用户名/Downloads/debs/*.deb ~/debs/ cp /mnt/c/Users/你的用户名/Downloads/openclaw.bundle ~/src/这样后续 dpkg 和 CMake 操作都在 ext4 虚拟磁盘上完成,不会再被跨文件系统的怪癖干扰。磁盘空间方面,如果 WSL 安装后默认虚拟盘不够大,可以用wsl --manage相关命令调大上限,或者直接清理 apt 缓存,优先保证/home下有足够空间。
3.3 禁掉 apt 在线源,用本地仓库接管依赖
完全离线的环境下,apt install ./xxx.deb看起来是本地安装,但实际上 apt 依然会去读软件源并尝试获取索引,导致整条命令卡在连接超时上。我建议直接把在线源暂时请走:
sudo mv /etc/apt/sources.list.d /etc/apt/sources.list.d.bak sudo mv /etc/apt/sources.list /etc/apt/sources.list.bak这样 apt 就成了纯本地操作,不会再浪费时间去连外部源。接下来有两种离线安装方式。
低配方式是用 dpkg 直接安装:
cd ~/debs sudo dpkg -i *.deb但 dpkg 不会帮你自动解析依赖顺序,几十个包来回倒腾依赖报错能把人逼疯。所以我的首选其实是给 apt 做一个本地文件源,让它像正常安装一样自动处理依赖。
把全部.deb放进一个目录,生成索引:
mkdir -p ~/local-repo/debs cp ~/debs/*.deb ~/local-repo/debs/ cd ~/local-repo sudo sh -c 'dpkg-scanpackages debs /dev/null > Packages'然后把本地源写入 apt 配置:
echo "deb [trusted=yes] file:///home/你的用户名/local-repo debs/" | sudo tee /etc/apt/sources.list.d/local.list sudo apt-get update本地源生效后,再安装依赖就非常简单了:
sudo apt-get install build-essential cmake pkg-config libsdl2-dev libpng-dev因为锁定了本地源,apt 不会再尝试访问外网,依赖关系自动解析,虽然索引生成和安装过程比在线环境慢一点,但胜在可靠。这招我强烈推荐,以后在隔离网内装任何软件都能复用。
3.4 磁盘、语言与基础环境微调
离线安装完基础工具链后,顺手做两件事。第一是保证系统 locale 是 UTF-8,否则 CMake 输出和源码里的中文字符串可能出现乱码,虽然不致命但影响排查问题。第二是确认pkg-config能找到刚才装的库:
pkg-config --modversion sdl2 pkg-config --modversion libpng如果输出了版本号,说明依赖库的.pc文件安装正常。这一步非常关键,因为 CMake 的 find_package 底层就是靠 pkg-config 做定位的,pkg-config 找不到,CMake 大概率也找不到,后面编译必然报错。
4. OpenClaw 编译实战与常见错误修正
4.1 CMake 配置与编译命令
依赖就位后,开始编译 OpenClaw。先把源码从 git bundle 还原出来:
git clone ~/src/openclaw.bundle OpenClaw cd OpenClaw git checkout origin/HEAD接着创建 build 目录,执行 CMake 配置。我没有直接用项目根目录作为构建目录,而是在里面单独开一个 build 文件夹,把生成文件全隔离起来,以后想清干净重编一个rm -rf build就搞定,非常干净。
mkdir build && cd build cmake .. -DCMAKE_BUILD_TYPE=Release make -j$(nproc)-j$(nproc)的意思是让 make 使用所有 CPU 核并行编译。如果机器核心多,速度会快很多;但如果内存不够大,并行任务太多反而会卡死,可以考虑固定一个数字,比如-j4。编译期间输出大量警告是正常的,只要没有 error 级别的内容就继续等。
如果 CMake 配置阶段直接红字一片,多半是依赖库没找到。先在 build 目录里搜一下缓存:
grep -E "SDL|PNG|CMAKE_PREFIX_PATH" CMakeCache.txtCMakeCache.txt 记录了所有配置结果,能看到每个依赖的 FOUND 状态和路径。如果某个库显示 NOTFOUND,就用pkg-config确认它到底装没装上,装了但找不到,大概率是路径问题,可以在配置时手动指定:
cmake .. -DCMAKE_PREFIX_PATH=/usr/lib/x86_64-linux-gnu4.2 头文件与链接阶段的高频报错
编译过程中最常遇到的报错,我整理成一个速查表。
| 报错内容 | 含义 | 解决方向 |
|---|---|---|
fatal error: SDL.h: No such file or directory | SDL2 开发头文件缺失 | 安装 libsdl2-dev |
cannot find -lSDL2 | 链接器找不到 SDL2 库 | 检查 libsdl2-2.0-0 是否安装 |
fatal error: png.h: No such file... | libpng 开发头文件缺失 | 安装 libpng-dev |
cannot find -lz | zlib 链接失败 | 安装 zlib1g-dev |
/usr/bin/ld: warning: ... DSO missing from command line | 链接顺序或依赖库顺序问题 | 更新 CMake 的 target_link_libraries |
error while loading shared libraries: libSDL2-2.0.so.0 | 运行库路径没找到 | 确认运行库已安装,ldconfig 生效 |
其中最容易误导人的是DSO missing from command line这种,它本身是个 warning,但如果你把-Wl,--fatal-warnings打开了,就会变成 error。这类问题一般是背后某个静态库依赖了动态库,但 CMake 没把依赖项理清楚。解决方法是看 CMakeLists 里 OpenClaw 的 target_link_libraries,把 SDL2、PNG、zlib 依次补进去。
还有一类是编译器选项冲突,比如项目代码用了老式写法,而 GCC 13 默认标准是 C++17,导致某个库的旧头文件不兼容。遇到这种情况不要急着升级编译器,先用 git 看项目最近的 commit 是否已经为 GCC 13 做过适配,如果适配过,那就是你拉取的源码分支太老,切到 release 分支或者最新 tag 就好。
4.3 游戏资源包与数据目录处理
编译成功后会在 build 目录下生成一个可执行文件,比如openclaw,但光有引擎还不行,OpenClaw 项目本身不包含原始游戏数据。原版的图像素材、关卡地图、音效音乐都需要玩家从自己合法备份的原版安装文件里提取。把资源目录放到哪,决定关系到游戏能不能正常启动。
最常见的做法是在源码目录附近建一个 data 目录,然后按项目 README 里说明的资源结构把原版文件复制进去。如果引擎没法自动找到资源位置,运行时会报找不到数据文件的错误,这时候可以用命令行参数手动指定:
./openclaw --data /home/你的用户名/OpenClaw/data如果懒得每次输参数,可以在 CMake 配置阶段通过项目提供的数据路径宏去设置,具体宏名搜索 CMakeLists 里带DATA的配置项即可。编译装配这东西,很多时候不是代码问题,而是资源路径没对齐。
5. 图形界面运行与显示环境
5.1 WSLg 自动显示与 DISPLAY 排查
OpenClaw 是图形程序,WSL 里能不能弹窗是验证环境成功与否的最后一道关卡。较新版本的 WSL2 默认启用 WSLg,启动应用时不需要任何额外设置。先验证一下显示环境:
echo $DISPLAY正常情况下会输出一个:0,这就说明 DISPLAY 环境变量已由 WSLg 自动设置。如果输出为空,大概率是 WSL 版本过旧或者 WSLg 组件没有正常运行,可以执行wsl --update升级。如果显示服务本身没有启动,在wsl --version里排查是否带上了 GUI 支持。
为了验证 OpenGL 渲染管线是否正常,安装 mesa-utils 之后跑一下 glxinfo 也不贵,它能显示当前 WSLg 转发的是软件渲染还是硬件加速,OpenClaw 在 2D 模式下对 OpenGL 版本要求不高,只要基础上下文能建立,窗口基本就能出来。
5.2 手动接管 X Server 的替代路线
如果目标机器因为某些原因无法使用 WSLg,那就得走传统 X Server 路线。在 Windows 侧安装第三方 X Server,比如 VcXsrv,启动时允许访问控制。然后在 WSL 里手动设置 DISPLAY 地址:
export DISPLAY=127.0.0.1:0需要注意,这个方案依赖 WSL 和 Windows 之间的回环网络。如果发现 DISPLAY 设了但还是打不开窗口,可以用xhost在 Windows 侧放行请求,或者在 WSL 里用telnet 127.0.0.1 6000测试 X 端口通不通。更常见的原因是 Windows 防火墙拦了 6000 端口,在防火墙高级设置里放行对应程序即可。
实战中,默认优先走 WSLg,不要一上来就改 DISPLAY。手动覆盖 DISPLAY 会把 WSLg 自动分配的路径搅乱,导致窗口渲染到错误的位置,反而更难排错。
5.3 音频与输入设备的小坑
WSL2 对音频的支持依赖 PulseAudio 或者 PipeWire 的重定向通道,WSLg 环境下通常会自动配置好。OpenClaw 启动时若 SDL 音频初始化报Could not initialize,先检查:
echo $SDL_AUDIODRIVER如果值为空,可以尝试强制指定:
export SDL_AUDIODRIVER=pulseaudio ./openclaw --data /path/to/data如果连 PulseAudio 都无法工作,就把音频驱动的优先级压一压,回头再逐个试。输入设备方面,SDL 默认会从 evdev 和 XInput 读取键盘鼠标,WSLg 下这些设备映射是自动的,反而很少出问题。最可能遇到的倒是键盘布局不对,比如美式布局下字符错位,可以通过环境变量调整 SDL 的键盘映射。
6. 踩坑实录:离线安装的高频问题速查表
6.1 问题与解决对照表
这一路踩过的坑,汇总成一张排查表,适合以后直接对照。
| 问题现场 | 根因 | 解决办法 |
|---|---|---|
apt update永远卡在连接 | 网络策略封了外部源 | 注释或备份 sources,改用本地仓库 |
dpkg -i *.deb报一堆 unsatisfied dependencies | 依赖顺序没理清 | 用dpkg-scanpackages建本地源,交给 apt 解析 |
| 在 /mnt/c 下安装时报文件不存在 | 9P 文件系统权限怪癖 | 把 deb 先复制到 ~/debs,再安装 |
| 编译报找不到 SDL.h | libsdl2-dev 没装 | 离线补装 libsdl2-dev |
| 编译报找不到 libSDL2 | 链接库缺失 | 安装 libsdl2-2.0-0 |
| 窗口打开后黑屏或退出 | Mesa 渲染初始化失败 | 设置LIBGL_ALWAYS_SOFTWARE=1,安装 mesa 相关驱动包 |
| 窗口打开时报 cannot open display | DISPLAY 变量为空/被覆盖 | 确认 WSLg 默认值,必要时手动export DISPLAY=127.0.0.1:0 |
| 声音初始化失败 | 音频驱动不匹配 | 设置SDL_AUDIODRIVER=pulseaudio或按项目参数禁用声音 |
| dpkg 安装时架构冲突 | 在线机拉错架构包 | 在在线机确认arch后重新拉包 |
| 卸载旧依赖后程序运行时提示缺库 | 运行库删了 | 把不带 -dev 后缀的运行包装回来,别一刀切清空 |
6.2 依赖顺序、备份策略与复盘心得
连续踩坑之后,我总结出三条离线安装的通用原则,现在每次遇到隔离环境安装都会遵守。
第一,永远先做一个本地软件源,不要直接 dpkg 硬灌。本地源虽然多花两分钟配置,但能把依赖解析这个最耗时最容易出错的部分完全自动化,后续不管是补装还是卸载都能正常工作。第二,保存离线包时连同版本信息一起保存,不要只关注包名。同一类的 dev 包在不同 Ubuntu 版本里依赖的 soname 会变,按版本归档才能避免目标机安装时出现 ABI 冲突。第三,编译前务必先验证 pkg-config 和 CMake 的探测结果,别急着 make 一把梭。前十分钟多花点时间确认依赖全部就位,后面编译时间至少能省一小时。
另外,建议在联网机器上时就把dpkg-scanpackages生成好的 Packages 索引一起放进离线包目录。这样到了目标机直接配置本地源,省掉再跑一遍索引的时间。这个技巧看着琐碎,但在包数量比较多的时候非常管用。
6.3 资源与数据文件的离线备份
最后提醒一个容易被忽略的点:OpenClaw 的原版数据文件同样需要离线准备。游戏引擎编译得再好,没有数据目录也只是一具空壳。数据文件来源必须是合法备份的原版游戏安装内容,拿到后先压缩打包,和依赖包、源码一起归档到同一个离线目录里。压缩时建议保留目录层级,因为引擎内部对路径有严格预期,拆乱了会导致启动时报找不到关卡文件。
我在实际操作中的体会是,整个离线安装流程最怕的不是命令敲错,而是“以为装好了其实没装上”。比如 pkg-config 能查到 SDL2,但 CMake 里因为 CMAKE_PREFIX_PATH 不对,链接还是失败;或者 dpkg 看起来全部装完,实际有几个包因为前面依赖没到位被跳过了。遇到这类情况,冷静下来看 CMakeCache 和 dpkg 日志,比继续瞎试命令有效得多。
环境一旦跑通,后面再在这台机器上装其他游戏引擎或者图形项目,就只需要把对应依赖包拉齐,套同一套本地源方法即可。离线安装这件事,本质上就是提前把网络替换成文件系统,谁把依赖规划和文件归档管理得好,谁就能少加班。