ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

麒麟V10上搭建UE5.3与Vscode开发环境:从源码构建到调试全攻略

麒麟V10上搭建UE5.3与Vscode开发环境:从源码构建到调试全攻略

最近帮组里把开发机上的UE5环境重新捋了一遍,系统用的是麒麟V10,引擎是5.3版本,日常写代码全靠Vscode。这套组合不像Ubuntu + Clion那样开箱即用,中途踩了不少坑,也摸出了一些门道。写这篇东西,就是想把整个布置过程、背后的取舍、以及那些文档里不会写的细节一次说清楚,如果你正好也要在麒麟V10上搭UE5.3加Vscode的开发环境,直接照着做能省掉大半天的试错时间。

整篇文章会从底层系统准备讲起,再到UE5.3的源码构建,然后Vscode的调试和代码补全配置,最后把实战中遇到的高频问题做成一份排查清单。内容不长篇大论,但每一步都给了具体命令和参数,适合Linux上做游戏开发或者想用UE做可视化的朋友。无论你是第一次接触麒麟系统,还是已经对UE5很熟但没试过Linux构建,这篇文章都值得花几分钟读完。

1. 项目整体设计思路与选型分析

1.1 核心需求拆解

先把这个项目标题拆开看,其实有三个独立但必须串联起来的部分:麒麟V10操作系统、UE5.3引擎、Vscode开发环境。三者缺一不可,但又互相牵制。

麒麟V10本质上是Linux发行版,虽然它自带了一些图形界面和软件商店,但骨子里还是标准POSIX环境。这意味着所有为Windows设计的开发工具都不能直接用,UE5.3恰好有Linux版本,但那个版本不是拿来就能用的,默认给的是源码或者说编译中间产物,需要你自己走一遍构建流程。

UE5.3作为游戏引擎和实时渲染工具,对系统底层的图形库、音频库、输入设备都有硬性要求,比如X11、GLX、OpenGL、ALSA这些。麒麟V10虽然内置了很多驱动,但开发库那一层往往不全,尤其是头文件和链接库,装系统的时候不会给你带全,这就导致直接拉下来UE源码编译,会报一堆"找不到XXX.h"的错误。

Vscode作为编辑器和调试前端,本身是Electron应用,装起来不复杂,复杂的是怎么让它跟UE5的构建系统和调试器打通。UE5自己内置了一套基于CMake的构建逻辑,还有用XgennerateProjectFiles脚本生成的编译规则,Vscode需要通过tasks.json和launch.json去调用这套规则,才能实现按一个F5就跑起来、断电、看变量。

这三个部分组合起来,本质上就是在做一件开发环境下的事情:把引擎编译出来,把编辑器配好用起来。环境本身不是产品,但开发环境不顺畅,产品和业务都会被拖累。

1.2 为什么选择这个组合

我之所以选麒麟V10 + UE5.3 + Vscode这套搭配,最重要的原因是组织内部有国产系统兼容性要求,同时团队又想保持跨平台项目的一致性。你可能会问,为什么不直接用Ubuntu,非要麒麟,这里不讨论政策层面,只从技术角度说——麒麟V10的包管理器和驱动生态已经足够支撑UE5的日常开发,尤其在x86架构上,基本上能做到和Debian系发行版差不多的稳定性。

UE5.3选择源码构建而不是使用预编译包,是因为官方没有提供Linux的预编译编辑器,只有Windows版有从Launcher一键装的模式。Linux版需要从Git仓库拉取全部代码,然后自己编译,这个过程在文档里写得比较模糊,实际有不少隐藏依赖。不过好处是你能控制编译选项,比如裁剪一些用不到的模块,或者对特定GPU做优化。

Vscode其实不是唯一选择,CLion、Qt Creator、甚至Vim+终端也能干,但Vscode的优势在于轻量、插件生态丰富、调试配置直观。尤其处理UE这种超大项目时,它的C++插件能通过compile_commands.json拿到精准的编译参数,代码高亮和跳转速度快,而且不占用太多内存。这点很关键,因为UE5编辑器本身已经吃内存吃紧,再来一个笨重的IDE,日常使用会很难受。

1.3 整体流程路线图

动手之前我先把大致流程画在脑子里:

第一步,确认系统版本和架构,装好编译工具链和UE5需要的系统库。这一步大概耗时二十分钟到半小时,如果你用的已经是完整开发版系统,时间可以更短。

第二步,拉取UE5.3源码,这里要特别提醒:源码仓库很大,而且用了Git LFS,必须提前配置好LFS,否则文件下不全,构建的时候凭空多出无数报错。

第三步,运行Setup脚本自动下载第三方依赖库,这个阶段网络要好,下载量非常大,接近三十个G,不信你试试就知道。

第四步,生成Makefile编译脚本并开始编译引擎。这一步耗时最长,根据CPU核心数不同,通常需要两到三个小时,我多用-j参数把编译并发拉满,但要小心内存不够。

第五步,等引擎能跑起来,生成或者导入一个空工程,验证编辑器启动、材质编辑器和蓝图都能正常工作。

第六步,配置Vscode,包括安装C++扩展、配置IntelliSense的includePath和defines、新建tasks和launch配置,最后实现编译一次,改错能断点,断点能看变量。

这路线看似简单,但每一步都埋着坑,下面逐章展开聊。

2. 环境准备:系统与依赖安装

2.1 系统基础检查与网络配置

拿到一台装好麒麟V10的机器,先别急着装东西,花五分钟把底子摸清楚。我用的是x86_64架构,如果你那边是ARM架构,后边的软件包名可能会有些差别,编译参数也可能要调整。

打开终端,依次跑下面几个命令:

uname -a cat /etc/os-release df -h /home free -h

这几个命令分别查看内核版本、发行版详情、主目录磁盘空间和内存大小。UE5.3构建需要非常可观的磁盘空间,建议留出至少100G,内存至少16G,不然编译过程会直接被OOM打断。

网络检查也很关键,因为后续要从远端仓库拉几十个G的源码和依赖。麒麟V10默认用有线网络,一般没太多问题,但在公司里可能会遇到代理或防火墙限制。你可以这样确认连通性:

ping mirrors.xxx.com curl -I http://example.com

如果内网走得通但外网拉不动,就要提前配好镜像源或代理。我这里用的是周边公网资源,直接把所有软件源切换到更快的镜像之后,下载速度才稳得住。

2.2 安装基础编译工具链

UE5.3的编译工作主要依赖GCC和CMake。麒麟V10自带的软件仓库比较全,直接用包管理器装即可。这里以Debian系分支为例,如果你那边是Yum系,把apt换成dnf或者yum就行。

sudo apt update sudo apt install -y gcc g++ cmake make git build-essential

装完后检查一下版本:

gcc --version cmake --version make --version git --version

我这边测试时GCC版本是9.4,CMake是3.16,Make是4.2,UE5.3对版本要求不算苛刻,没有强制需要最新的编译器,但建议GCC不低于9.2,CMake不低于3.12,否则后续生成Makefile的时候会报错。

2.3 安装UE5.3的系统级依赖

这一步是踩坑重灾区。很多人在编译UE5.3时遇到fatal error: X11/Xlib.h: No such file or directory,就是因为系统里没有装X11开发头文件。UE的编辑器本质是一个图形应用,它依赖一大堆X11相关的库,同时还依赖OpenGL、openssl、ncurses等。

推荐一次性把开发包全部装上:

sudo apt install -y libx11-dev libxcursor-dev libxrandr-dev libxi-dev \ libxinerama-dev libxxf86vm-dev libxext-dev libxfixes-dev \ libgl1-mesa-dev libglu1-mesa-dev mesa-common-dev \ libgtk-3-dev libssl-dev libasound2-dev libpulse-dev \ libnss3-dev libnspr4-dev libtinfo-dev libatomic1

注意libtinfo-dev,这个库在比较新的发行版里可能不叫这个名字,有时候需要装libtinfo5或者libtinfo.so.5这个兼容层。因为很多第三方二进制依赖的是.so.5版本,但新系统只装了.so.6,会导致UE的启动器打不开。

另外,如果你之前已经装过驱动,图形相关的库一般不会缺。但我还是建议把mesa-common-dev装上,因为它会提供GL相关的头文件,UE5.3的渲染初始化依赖于它。

还有一个小细节:UE5.3需要Python来运行某些构建脚本。麒麟V10一般带Python 3.7或者3.8,确保python3命令可用:

python3 --version

如果没有,安装python3-dev,因为部分脚本需要Python开发头文件。

装完依赖,你可以做一个简单测试,编译一个带窗口的Demo程序,跑起来保证图形和X11环境没问题,然后进入下一步。这个测试不是必须的,但能提前把环境和引擎编译解耦开来,减少后续排查问题的范围。

3. UE5.3引擎的获取与编译

3.1 获取UE5.3源码:Git与LFS准备

UE5.3的Linux版不像Windows那样能从官方启动器直接下载,它要自己从仓库克隆。这一步建议直接使用官方仓库,但实际操作中我遇到两个问题:一是仓库体积巨大,二是有大量二进制资产走LFS。

先装Git LFS:

sudo apt install -y git-lfs git lfs install

然后克隆源码仓库。仓库URL这里不写具体地址,你直接用发行版对应的仓库就行。注意克隆时一定要加上--depth 1?不行,UE的构建脚本会切换分支,浅克隆反而会出问题。所以我直接全量克隆:

git clone git@github.com:xxx/ue5.3.git

拉取时间取决于网络,我这边的内网源大概花了四十分钟。克隆完成后,一定要进入仓库目录再执行LFS拉取:

cd ue5.3 git lfs pull

这一步会拉所有的二进制资产,体积很大,耐心等。如果中途因为网络中断,可以多次执行git lfs pull,它会增量续传,非常稳。

3.2 运行Setup脚本下载第三方依赖库

UE的仓库里放着一个Setup.sh脚本,它的作用是自动检查和下载引擎运行所需的第三方库,包括OpenCV、PhysX、Havok、libWebRTC等苹果家和微软家的闭源组件,还有一些音频中间件。这个脚本是必跑的,如果不跑,后面生成Makefile链接阶段会报一堆找不到库的错误。

执行前建议给脚本加权限:

chmod +x Setup.sh ./Setup.sh

这个脚本会先自动检测你已经安装的依赖,然后挨个下载并解压到/Engine/Source/ThirdParty目录下。如果网络不好,这个脚本执行时间会非常长,我遇到过一次下载到一半卡住的现象。解决办法是把终端挂几天?不现实,我更推荐配一个代理或者换一个干净的网络重试。

还有一个容易忽略的点:Setup结束后,脚本会提示你缺少一些包,这时根据提示再补装。我自己就遇到过提示缺少libatomic1,补装后重新执行一遍Setup就顺利过了。

3.3 使用s和Build脚本生成工程与编译

Setup完成后,就开始构建引擎本体。UE的Linux构建方式通常有两种:一种是用它自带的GenerateProjectFiles.sh生成Makefile,另一种是直接用make去跑。这里我推荐后者,逻辑更清晰。

先执行:

./GenerateProjectFiles.sh -makefile

该脚本会分析当前系统环境和UE的配置,生成一套适合本平台的Makefile。执行过程中如果你用的是root账号,它可能报错不允许以root编译,这里建议用一个普通用户执行编译,避免意外污染系统文件。

接下来就是漫长编译阶段。进入某个生成目录后,运行以下命令:

make -j$(nproc) 2>&1 | tee build.log

-j参数是并行编译的线程数,我用的是8核心16线程,-j16编译大概花了两小时。如果你内存只有16G,建议-j8,否则会内存耗尽导致编译进程被杀掉。

编译时会刷出大量警告,别慌,正常现象。要留意的是error开头的行。如果你看到error: X11/Xlib.h等,说明步骤2.3里有依赖没装全,回去补装再重跑make即可。

3.4 验证引擎安装是否成功

构建完成后,可以在引擎根目录下找启动脚本:

./Engine/Binaries/Linux/UnrealEditor

如果路径正确,会弹出一个登录窗口。首次启动需要联网验证,然后进入编辑器主界面。这里需要注意,麒麟系统如果没装好显卡驱动,启动时可能会报OpenGL版本过低的错误,这时候回退到软件渲染也能跑,但性能很差。

为了验证编译成果,更好的方式是用一个空工程跑起来。UE自带了一些模板,你也可以创建一个纯空白的C++工程。

假设你现在已经有一个工程,可以用以下命令行启动编辑器并加载该工程:

./Engine/Binaries/Linux/UnrealEditor <udk_project_name>.uproject

执行后看到蓝图编辑器和关卡视口正常渲染,就说明引擎安装基本完成。接下来就该配置开发环境了。

4. Vscode开发环境配置详解

4.1 安装Vscode及C++扩展

Vscode在Linux上的安装方法很多,麒麟V10的软件商店里可能也有,我建议直接从官网下载deb包安装,或者用仓库里的版本,只要能用就行。安装完成后打开Vscode。

接着装两个核心扩展:C/C++(微软官方出品)和C++ Intellisense,后者是llvm-clang基于clangd的补全引擎,对大型C++项目性能更友好。在扩展商店搜索并安装ms-vscode.cpptools和llvm-vs-code-extensions.vscode-clangd。

如果你要用调试功能,还需要确认系统里有gdb:

sudo apt install -y gdb

然后按Ctrl+Shift+X打开扩展面板,安装后重启Vscode。

4.2 配置IntelliSense与代码提示

UE5项目里的C++代码经常依赖宏、反射系统、模块系统,直接开箱会让编辑器看不明白,需要你手动配置includePath和defines。

最容易的方法是用compile_commands.json。UE5已经内置了-CMake生成方式,但我更推荐直接用Build.sh生成编译信息。

在你编译引擎或工程时,如果使用VSCode的插件,它通常会在Build/目录下找到相关文件。我这边通常是先把生成命令弄到一个文本文件里,然后让VSCode读取。

具体到Vscode的C++插件,手动创建一个.vscode/c_cpp_properties.json,并填写如下结构:

{ "configurations": [ { "name": "UE5", "includePath": [ "/path/to/UE5/Engine/Source/**", "/path/to/UE5/Engine/Plugins/**", "/path/to/your/Project/Source/**" ], "defines": ["UE_BUILD_DEVELOPMENT=1", "WITH_EDITOR=1", "PLATFORM_LINUX=1"], "compilerPath": "/usr/bin/g++", "cStandard": "c17", "cppStandard": "c++20", "intelliSenseMode": "gcc-x64" } ] }

这里要注意defines里面必须要定义UE_ISMONOLITHIC等宏,否则很多源码跳转时会报找不到某个函数。Windows下常见的是WIN32, Linux下必须加上LINUX。

如果你用clangd,可以在工程根目录下运行:

bear -- make -j8

这个工具能自动抓取编译参数并生成compile_commands.json,然后clangd会读取它,实现精准的代码补全和跳转。bear可以自己从源码编译,也可以直接apt安装。

4.3 配置编译任务:tasks.json

Vscode的F5调试和Ctrl+Shift+B编译任务是分开的。先配置编译任务,让你按那个快捷键就能触发UE项目的编译。

在.vscode/tasks.json里,创建一个make任务,也可以直接调用UE自带的编译脚本。我这里用的是直接围购引擎和工程的编译命令,你可以参考以下配置:

{ "version": "2.0.0", "tasks": [ { "label": "Build UE5 Project", "type": "shell", "command": "/path/to/UE5/Engine/Build/BatchFiles/Linux/Build.sh", "args": ["YourProjectName", "Development", "Linux", "-Project=/path/to/YourProject.uproject"], "group": { "kind": "build", "isDefault": true }, "problemMatcher": ["$gcc"] } ] }

Build.sh是UE官方提供的跨平台编译脚本,它比直接make更贴近项目配置。这里要注意,Linux下的ProblemMatcher建议用$gcc,这样编译时的error: ...和warning: ...能被正确捕获,并在“问题”面板中显示。

如果你的项目没有C++代码,只有蓝图,其实不需要编译任务,但既然用了Vscode开发环境,大概率还是要写C++的。

4.4 配置调试:launch.json

调试功能是Vscode最常用的部分。用Ctrl+Shift+D打开调试面板,创建launch.json,然后配置gdb启动程序:

{ "version": "0.2.0", "configurations": [ { "name": "Debug UE5", "type": "cppdbg", "request": "launch", "program": "/path/to/UE5/Engine/Binaries/Linux/UE5Editor-Linux-DebugGame", "args": ["/path/to/YourProject.uproject"], "cwd": "${workspaceFolder}", "environment": [], "externalConsole": false, "MIMode": "gdb", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true } ], "preLaunchTask": "Build UE5 Project" } ] }

注意,这里program路径要填你编译出来的可执行文件。Debug模式下可执行文件一般是UE5Editor-Linux-DebugGame,开发构建则是UE5Editor-Linux-Development。不要搞混。

连上断点后,需要等启动过程进入编辑器,再加载项目,然后在C++源码里打断点就能看到变量值了。整个过程第一次跑可能会慢,因为要加载引擎资源。

4.5 用最小工程验证环境

为了确认整套配置没问题,我通常会在Config/目录下新建一个简单的空白工程,或者直接用UE自带模板创建一个C++工程,命名为TestProject。

然后打开Vscode,用Ctrl+Shift+B执行编译,确认正常生成引擎二进制,没有红色错误。再按F5,如果一切正常,会看到编辑器启动并加载工程。此时在GameMode.cpp里打一个断点,运行Play,断点能命中的话,整条链路就没问题了。

这条验证路径一次通过,你就能确定:麒麟V10系统、UE5.3、Vscode三者已经完全融合。

5. 常见问题与排查技巧实录

搭建这套环境时,不管是编译还是运行,肯定绕不开那几个经典问题。下面把我在麒麟V10上实际踩过的坑和对应的排查思路全部列出,可以直接当速查表用。

症状原因解决办法
编译时找不到X11/Xlib.h没装X11开发包sudo apt install -y libx11-dev libxt-dev
链接时提示libtinfo.so.5缺失新版系统只装libtinfo.so.6装libtinfo5或做软链:ln -s librtasp tinfo.so.6 /usr/lib/x86_64-linux-gnu/libtinfo.so.5
启动编辑器时OpenGL版本报错显卡驱动不适用或未加载确认/dev/dri存在,重装mesa库;如果还不行,临时用软件渲染:LIBGL_ALWAYS_SOFTWARE=1
运行 sudo make 报错Unreal引擎不允许root直接编译换普通用户执行make,或者严格设置工程目录的所有权
Setup.sh 下载第三方库永远失败网络受限或代理问题设置环境变量HTTP_PROXY和HTTPS_PROXY,或切换到联动网络
编译时内存不足被杀并发线程数过高降低-j参数,比如从-j16降到-j8;同时增加swap
Vscode代码补全不认UE类型缺少编译宏定义检查c_cpp_properties.json里的defines,至少包含UE_BUILD_DEVELOPMENT=1与WITH_EDITOR=1
调试时断点不断在C++代码编译符号不完整或调试信息未生成确保用Development或DebugGame配置编译,不要在Release下调试
编辑器启动后白屏,无内容显卡驱动或显示输出问题尝试从终端启动,查看崩溃日志以及/root/.config/UnrealEngine下的日志文件

下面两个问题单独展开说一下,因为我是真在这里卡了很久。

第一个是Setup.sh脚本切分支后报错。网络抖动时LFS对象不完整,会导致后续GenerateProjectFiles失败。解决办法是重新运行git lfs pull,如果还不行,删除.git/lfs缓存再拉一次,问题就解决了。

第二个是Vscode插件和UE的类型系统冲突。如果不做任何配置,代码里到处都是红色波浪线,根本没法用。其主要原因是UE里大量使用UCLASS()、UPROPERTY()这种宏,clang解析时如果不知道GENERATED_BODY()是什么,就会报意料外的符号。因此我把.vscode/c_cpp_properties.json里的defines中加上了UE_BUILD_DEVELOPMENT和WITH_EDITOR,红色波浪线几乎消失。如果你用clangd,记得把--query-driver指向本机的g++或者clang++,否则解析也会出错。

还有一些不太起眼但很影响体验的小坑:比如麒麟系统默认了桌面缩放,然后Vscode的界面文字糊开,可以在设置里换一个高分屏配置。另外,编译UE5工程时如果工程路径里有中文目录,会有排版问题,把工程放到纯英文路径下就能避免。

6. 一些优化建议和实战操作心得

整个环境搭完,我总结了几条个人觉得很好的优化经验。

第一,多个游戏工程共享同一份UE5源码。如果你有两个项目都要用UE5.3,没必要每个项目编译一份引擎。在项目目录里的BuildSettings.json中指定引擎路径,或者把UE5目录通过软链指向同一个引擎位置就行。这样节省了上百GB的硬盘空间,同时也能保证两个项目调用的引擎完全一致。

第二,首次启动编辑器前,建议预生成着色器缓存。在Linux里执行-compileShader可以提前编译好常用着色器,不然第一次打开关卡会非常卡,而且容易在编辑地形时崩溃。

第三,额外安装一个终端多路复用工具,比如tmux或者screen,因为编译引擎真的很耗时,用tmux把编译任务挂后台,出错后可以随时切回来继续看。这也是有效规避终端断线导致编译中断的好办法。

第四,建议在麒麟系统里写一个环境变量脚本,把UE相关的几个路径都写进去,比如引擎根目录,工具目录,甚至VULKAN_SDK,以后开新终端也不会忘了配。我自己在~/.bashrc里加了类似:

export UE5_HOME=/opt/UE5 export PATH=$PATH:$UE5_HOME/Engine/Binaries/Linux

第五,用Vscode配置files.exclude,把不用看的UE缓存目录比如Binaries/Intermediate/Saved过滤掉,这样“资源管理器”只显示你的源码和配置。如果你用Git,这一类目录也应该加到.gitignore里。

第六,如果内存不大,建议在编译时临时加一个8GB的swap文件:

sudo fallocate -l 8G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile

编译完成后再考虑是否保留,临时用比较香。

最后再分享一个小技巧:当Vscode的调试器无法命中断点时,看一下底部输出面板的gdb日志,有一种情况是断点所在源文件路径已经过时,比如修改了源码目录但没重新编译。解决办法是直接删除Binaries/Intermediate/Saved/目录下的缓存文件,然后重新编译一次,断点就正常了。这招在很多公司内部项目里都管用,比反复会检查配置要高效得多。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进