拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Ubuntu下Unreal Engine源码集成Cesium插件编译指南与问题解决

1. 项目概述与核心目标最近在Ubuntu 20.04.1上折腾Unreal Engine想把CesiumForUnreal这个强大的地理空间插件给集成进去结果发现这趟水比想象中深得多。如果你也打算在Linux环境下特别是Ubuntu上为UE引擎深度集成Cesium插件那么我踩过的这些坑、绕过的那些弯对你来说可能就是最直接的避坑指南。我们的最终目标很明确不是简单地把插件扔到某个项目里而是将它直接编译并嵌入到Unreal Engine引擎的源码目录中。这样做的好处是从此以后在这台机器上创建的任何UE项目都能直接调用Cesium插件无需再为每个项目单独安装或配置一劳永逸。听起来很美好但实现过程充满了各种编译报错、依赖缺失和路径问题尤其是在Linux这个对UE原生支持就相对“小众”的环境里。CesiumForUnreal插件本身是一个桥梁它将Cesium的全球3D地理空间数据流和地形服务带入了Unreal Engine的实时渲染世界。在Windows上官方提供了预编译的二进制包安装相对顺畅。但到了Linux尤其是需要从源码编译时情况就复杂了。你需要同时处理UE引擎源码的编译、Cesium Native库的构建以及最终插件模块的生成与集成这三者环环相扣任何一个环节的依赖或编译选项不匹配都会导致一连串令人头疼的错误。我这次使用的环境是Ubuntu 20.04.1 LTSUnreal Engine版本为4.26.2目标是将CesiumForUnreal插件源码成功编译并嵌入引擎。下面我就把整个过程中遇到的关键问题、解决思路和最终的成功方案详细拆解一遍。2. 环境准备与前置依赖梳理在开始编译之前一个干净、完备的底层环境是成功的基石。Ubuntu 20.04.1本身是一个比较稳定的LTS版本但UE4的编译对系统库的版本有特定要求不能简单地使用默认的软件源。2.1 系统包与编译工具链首先需要安装UE4官方文档要求的基础编译工具和库。这里不能直接用apt-get install build-essential了事因为UE4需要特定版本的Clang和libc。sudo apt-get update sudo apt-get install -y clang-10 lld-10 libc-10-dev libcabi-10-dev sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-10 100 sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-10 100 sudo update-alternatives --install /usr/bin/lld lld /usr/bin/lld-10 100选择Clang-10是因为它与UE4.26.2的兼容性经过社区验证。同时还需要安装一系列开发库sudo apt-get install -y git build-essential libx11-dev libxrandr-dev libxinerama-dev libxcursor-dev libxi-dev libxext-dev libssl-dev libfreetype6-dev libpng-dev libjpeg-dev libogg-dev libvorbis-dev libudev-dev libgl1-mesa-dev注意libssl-dev的版本很重要。Ubuntu 20.04默认提供的是OpenSSL 1.1.1而一些较旧的第三方库可能依赖1.0.x。如果后续编译Cesium Native时遇到SSL相关链接错误可能需要考虑从源码编译特定版本的OpenSSL但这会引入新的复杂度。我建议先使用系统默认版本如果出错再针对性解决。2.2 获取Unreal Engine源码你需要从Epic Games的GitHub仓库克隆UE源码。这需要关联你的Epic Games账户。确保你已经完成了账户关联并拥有访问权限。git clone -b 4.26 https://github.com/EpicGames/UnrealEngine.git cd UnrealEngine克隆完成后不要急于运行./Setup.sh。先检查磁盘空间UE源码及其编译中间文件会占用超过100GB的空间。接着运行设置脚本以下载二进制依赖./Setup.sh这个过程会下载大量文件耗时很长网络稳定性是关键。如果中途失败可以重新运行该脚本它会尝试续传。2.3 获取CesiumForUnreal插件源码我们需要的是插件的源码而不是发布页面的预编译包。前往CesiumGS的GitHub仓库克隆指定版本例如1.3.1该版本修复了许多早期问题。cd ~ git clone -b 1.3.1 https://github.com/CesiumGS/cesium-unreal.git克隆后目录结构大致如下。重要的是CesiumForUnreal目录和extern目录下的cesium-native子模块。cesium-unreal/ ├── CesiumForUnreal/ # 插件主目录 ├── Documentation/ ├── Samples/ └── extern/ └── cesium-native/ # 核心C依赖库需要单独编译进入cesium-unreal目录初始化并更新子模块cd cesium-unreal git submodule update --init --recursive这一步是必须的否则cesium-native目录是空的后续编译必定失败。3. 核心编译报错全解析与解决方案环境就绪后真正的挑战才开始。编译过程像闯关每一关都是一个典型的错误。3.1 错误一构建Cesium Native时的CMake配置失败首先需要编译cesium-native。进入其目录尝试用CMake生成构建文件。cd extern/cesium-native mkdir build cd build cmake ..典型报错1找不到spdlog等第三方库CMake Error at CMakeLists.txt:xxx (find_package): Could not find a package configuration file provided by spdlog...原因与解决cesium-native依赖许多第三方库如spdlog、uriparser、sqlite3等。它的CMake脚本会尝试从网络下载这些库。在Ubuntu上可能由于网络问题或代理设置导致下载失败。解决方案是预先安装这些库的开发版本。sudo apt-get install -y libspdlog-dev liburiparser-dev libsqlite3-dev安装后重新运行cmake ..。如果CMake仍然尝试从网络获取可以尝试在CMake命令中传递参数强制使用系统包cmake .. -DCMAKE_FIND_USE_PACKAGE_REGISTRYOFF -DCESIUM_USE_SYSTEM_SPDLOGON具体的变量名需要查看cesium-native的CMakeLists.txt但通常安装系统包后CMake就能自动找到。典型报错2OpenSSL版本不兼容Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR原因与解决虽然系统安装了libssl-dev但CMake可能找不到或版本不匹配。明确指定路径cmake .. -DOPENSSL_ROOT_DIR/usr/lib/ssl -DOPENSSL_INCLUDE_DIR/usr/include/openssl如果还不行检查/usr/lib/x86_64-linux-gnu下是否存在libssl.so和libcrypto.so并确保开发头文件在/usr/include/openssl。配置成功后进行编译make -j$(nproc)-j$(nproc)表示使用所有CPU核心并行编译加快速度。编译完成后在build目录下会生成libCesiumNative.so等库文件。记住这个编译输出目录的绝对路径例如/home/yourname/cesium-unreal/extern/cesium-native/build后续配置插件时会用到。3.2 错误二插件源码编译缺失CesiumRuntime模块接下来将cesium-unreal整个目录或者至少是CesiumForUnreal插件目录链接或复制到Unreal Engine的插件目录。我选择的是符号链接便于管理。# 假设你的UE源码在 ~/UnrealEngine cd ~/UnrealEngine/Engine/Plugins ln -s ~/cesium-unreal/CesiumForUnreal ./然后尝试编译整个Unreal Engine或者至少编译编辑器。进入UE源码根目录cd ~/UnrealEngine ./GenerateProjectFiles.sh make UE4Editor典型报错Fatal Error: Could not find definition for module CesiumRuntime (referenced via CesiumForUnreal.uplugin)原因与解决这个错误意味着Unreal Build Tool (UBT) 无法定位到CesiumRuntime模块的构建规则即其.Build.cs文件。虽然文件物理存在但UBT在解析插件依赖时需要知道cesium-native库的位置。关键步骤在于修改插件的构建描述文件。找到~/UnrealEngine/Engine/Plugins/CesiumForUnreal/Source/CesiumRuntime/CesiumRuntime.Build.cs。在文件的开头部分在PublicDependencyModuleNames添加之前你需要添加对cesium-native库的链接引用。但更常见的做法是通过一个ReadOnlyTargetRules参数将cesium-native的路径传递给构建系统。然而对于插件集成更可靠的方法是修改插件的.uplugin文件或确保Cesium Native以正确的相对路径被引用。实际上CesiumForUnreal插件设计时期望cesium-native被编译到插件目录下一个特定的ThirdParty目录。我们手动编译到了独立的build目录所以需要调整。更直接的解决方案查看CesiumRuntime.Build.cs里面通常会有寻找CESIUM_NATIVE_LIB_PATH环境变量或使用预定义相对路径的逻辑。我们可以手动创建符合预期的目录结构# 在插件源码目录下创建ThirdParty目录并将编译好的库和头文件复制过去 cd ~/cesium-unreal/CesiumForUnreal/Source/ThirdParty mkdir -p CesiumNative/Linux/x86_64-unknown-linux-gnu # 将之前编译的cesium-native的输出复制过来 cp -r ~/cesium-unreal/extern/cesium-native/build/lib* ~/cesium-unreal/CesiumForUnreal/Source/ThirdParty/CesiumNative/Linux/x86_64-unknown-linux-gnu/ cp -r ~/cesium-unreal/extern/cesium-native/include ~/cesium-unreal/CesiumForUnreal/Source/ThirdParty/CesiumNative/复制后需要确保目录结构被CesiumRuntime.Build.cs中的路径查找逻辑识别。你可能需要根据该文件的具体代码微调目录名例如它可能期望Debug或Release子目录。一个稳妥的方法是直接查看编译错误输出的详细日志看UBT具体在哪个路径下寻找什么文件然后依样创建。3.3 错误三链接阶段符号未定义错误即使模块定义被找到编译进入链接阶段后也可能出现大量undefined reference to错误。典型报错undefined reference to Cesium3DTiles::Tile::Tile() undefined reference to spdlog::logger::info(...)原因与解决这明确是链接器错误意味着UBT没有正确链接到libCesiumNative.so以及它的依赖库如spdlog。检查库文件是否被正确引用在CesiumRuntime.Build.cs中必须有类似下面的代码段if (Target.Platform UnrealTargetPlatform.Linux) { string LibPath Path.Combine(ModuleDirectory, ThirdParty, CesiumNative, Linux, x86_64-unknown-linux-gnu); PublicAdditionalLibraries.Add(Path.Combine(LibPath, libCesiumNative.so)); // 可能还需要其他依赖库 PublicAdditionalLibraries.Add(Path.Combine(LibPath, libspdlog.so)); }你需要确认LibPath的拼写与实际存放.so文件的目录完全一致包括大小写。Linux是大小写敏感系统。添加运行时库搜索路径为了让编译出的UE编辑器在运行时能找到这些.so文件需要在.Build.cs中添加RuntimeDependencies.Add(Path.Combine(LibPath, libCesiumNative.so));或者更简单粗暴但有效的方法是将这些库所在的目录添加到系统的LD_LIBRARY_PATH环境变量中。但为了永久嵌入引擎修改构建脚本是更规范的做法。处理依赖库的依赖libCesiumNative.so本身依赖libcurl,libssl,libcrypto等。这些系统库通常不需要特别指定因为链接器会在系统目录查找。但如果遇到相关未定义符号可能需要确保开发包已安装libcurl4-openssl-dev。3.4 错误四Unreal Header Tool (UHT) 生成代码失败Unreal Engine使用一套自定义的反射系统需要通过UHT工具解析带有UCLASS、UFUNCTION等宏的C头文件生成相应的胶水代码.generated.cpp文件。典型报错UnrealHeaderTool: Error: An error occurred while trying to generate code for CesiumForUnreal module. Log output: ...原因与解决UHT运行失败的原因很多常见于语法错误插件源码中的C代码在UHT解析阶段就存在语法错误。仔细检查错误日志指向的头文件。宏使用错误Unreal的宏如UPROPERTY使用不当。对照官方文档检查宏参数。模块依赖循环CesiumRuntime和CesiumEditor模块之间或者它们与其他引擎模块之间存在循环依赖。这需要在.Build.cs文件的PublicDependencyModuleNames和PrivateDependencyModuleNames中仔细梳理。UHT本身崩溃有时是UE版本与插件版本不兼容导致的。确保你使用的CesiumForUnreal插件分支版本如1.3.1官方声明支持你的UE版本4.26.2。排查技巧UHT的错误日志通常会在输出中直接显示有问题的代码行。重点关注日志开头部分。有时错误可能源于cesium-native的头文件如果这些头文件包含了UHT不支持的C新特性或语法。这时可能需要尝试更新cesium-native到与插件更匹配的提交或者尝试在编译cesium-native时使用更保守的C标准如-stdc14。4. 最终集成方案将插件嵌入引擎解决了上述编译错误后目标是将插件成功编译并“安装”到引擎中使其成为引擎的一部分。4.1 编译引擎与插件在UE源码根目录执行完整的引擎编译。这会同时编译所有插件包括我们链接进去的CesiumForUnreal。cd ~/UnrealEngine ./GenerateProjectFiles.sh -game -engine make -j$(nproc)-game -engine参数会生成同时包含引擎和游戏项目的解决方案如果用IDE对于命令行编译make会默认构建所有目标。这个过程非常漫长可能需要数小时取决于你的CPU性能。编译成功的关键标志在编译输出的最后没有出现“Error”字样并且生成了~/UnrealEngine/Engine/Binaries/Linux/UE4Editor可执行文件。同时在~/UnrealEngine/Engine/Plugins/CesiumForUnreal/Binaries/Linux/目录下应该能看到libCesiumRuntime.so和libCesiumEditor.so等文件。4.2 验证插件嵌入成功启动编辑器验证cd ~/UnrealEngine/Engine/Binaries/Linux ./UE4Editor如果编辑器能正常启动说明引擎核心编译成功。在编辑器中创建新项目验证启动UE4Editor。点击“新建项目”选择任意模板如“Blank”。在新建的项目中打开“编辑” - “插件”窗口。在插件列表的“已安装”或“内置”分类下应该能找到“Cesium for Unreal”。确保其复选框已被勾选启用状态。重启编辑器如果需要。功能测试在项目的内容浏览器中右键点击你应该能在上下文菜单中看到“Cesium”相关的选项例如“添加” - “Cesium” - “Cesium World Terrain Bing Maps Aerial Imagery”。尝试将一个Cesium太阳系对象拖入场景。如果场景视图能正确显示全球地形可能需要网络加载数据则说明插件不仅被加载而且功能正常。4.3 打包测试可选但重要为了确保插件被真正嵌入引擎而不仅仅是开发环境可用可以进行一次空项目的打包测试。cd ~/UnrealEngine/Engine/Build/BatchFiles/Linux ./RunUAT.sh BuildCookRun -project/path/to/YourTestProject/YourTestProject.uproject -platformLinux -clientconfigDevelopment -build -cook -stage -pak -archive -archivedirectory/path/to/output这个命令会执行完整的构建、烘焙、打包流程。如果打包成功并且在打包后的可执行程序位于/path/to/output/LinuxNoEditor/YourTestProject/Binaries/Linux/运行时Cesium功能依然可用那就证明插件已经成功地、完整地集成到了引擎运行时中。5. 疑难杂症与深度排查记录即便按照上述步骤你可能还是会遇到一些独特的问题。这里记录几个我遇到的“深水区”问题。5.1 问题编译通过但编辑器启动时崩溃日志提示“Plugin ‘CesiumForUnreal’ failed to load”排查思路检查日志文件UE编辑器的日志通常位于~/.config/Epic/UnrealEngine/4.26/Saved/Logs/或项目目录的Saved/Logs/下。查看最新的.log文件搜索“Cesium”和“fatal”、“error”等关键词。常见原因 - 符号冲突cesium-native库与UE引擎或系统库使用了相同名称但不同版本的符号尤其是像spdlog这种被广泛使用的库。如果cesium-native静态链接了某个库而UE引擎动态链接了另一个版本就可能冲突。解决方案尝试将cesium-native及其依赖全部编译为静态库.a文件并在链接时将其全部静态链接到插件模块中。这需要修改cesium-native的CMake配置设置BUILD_SHARED_LIBSOFF并相应调整插件.Build.cs文件链接.a文件而非.so文件。常见原因 - 运行时依赖缺失插件模块依赖的.so文件没有被打包到正确的位置或者系统的动态链接器找不到它们。解决方案使用ldd命令检查编译生成的插件库文件ldd ~/UnrealEngine/Engine/Plugins/CesiumForUnreal/Binaries/Linux/libCesiumRuntime.so查看是否有“not found”的库。将缺失的库来自cesium-native/build或系统复制到引擎的Binaries/Linux目录下或者确保LD_LIBRARY_PATH环境变量包含了这些库的路径。对于嵌入引擎最干净的做法是在.Build.cs中通过RuntimeDependencies声明让UBT在打包时自动处理。5.2 问题Cesium地形或影像数据无法加载但插件UI正常排查思路网络连接Cesium需要从网络获取瓦片数据。检查编辑器或打包后的程序是否有网络访问权限防火墙设置。在Linux上打包后的程序可能需要额外的库来处理SSL/TLS如libssl.so.1.1,libcrypto.so.1.1。访问令牌Cesium Ion资产需要有效的访问令牌。在编辑器的Cesium面板中检查是否已登录或配置了有效的默认令牌。日志级别启用更详细的Cesium日志。可以在项目配置文件中添加[Cesium] LogLevelVerbose查看日志输出了解数据加载失败的具体原因如HTTP错误码、认证失败等。5.3 关于“直接嵌入引擎”的再思考我们做的“符号链接到Engine/Plugins”并重新编译引擎实际上是将插件作为“引擎插件”Engine Plugin来编译。这与“项目插件”Project Plugin有本质区别引擎插件编译进引擎二进制文件或作为引擎模块加载对所有使用该引擎的项目全局可用。这就是我们想要的效果。项目插件只存在于特定项目的Plugins文件夹下仅对该项目有效。因此我们的方法在理论上是正确的。但需要注意当你升级UE引擎版本时这个自定义编译的插件需要重新针对新引擎源码进行编译和集成。这比使用项目插件要更繁琐。6. 总结与最终建议在Ubuntu上为Unreal Engine源码集成CesiumForUnreal插件是一个对Linux系统管理、C编译工具链和Unreal构建系统都有一定要求的任务。整个过程的核心可以概括为确保环境依赖一致、理清库的链接路径、遵循Unreal的模块化构建规则。我个人的最终成功配置清单如下系统Ubuntu 20.04.1 LTS编译器Clang 10.0.0UE版本4.26.2 源码CesiumForUnreal插件版本1.3.1 (git branch)Cesium Native版本与插件1.3.1标签对应的子模块提交关键操作使用系统包管理器安装所有可安装的cesium-native依赖spdlog, uriparser等。将cesium-native编译为静态库避免潜在的动态库冲突。精确配置CesiumRuntime.Build.cs和CesiumEditor.Build.cs中的库路径和链接选项确保指向我们编译好的静态库文件.a。将插件目录符号链接到Engine/Plugins后执行完整的make UE4Editor编译而非单独编译插件。对于后来者我的建议是如果并非绝对必要在Linux上使用预编译的UE版本并通过项目插件的方式使用Cesium会是更轻松的选择。但如果你的团队确实需要定制化引擎或者有严格的离线部署需求那么这条“从源码编译并嵌入”的道路虽然坎坷但走通之后你对UE构建系统和插件架构的理解会深刻得多。每次编译失败仔细阅读错误信息从UBT和UHT的日志中寻找线索大部分问题都能在GitHub Issues、Unreal官方论坛和Cesium社区中找到解决方案或讨论。耐心和细致的日志分析是解决这类复杂集成问题的唯一捷径。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门