mcpField
U
unreal-thirdparty

unreal-thirdparty

github.com/maystudios开发26104 次安装11 周前更新
代码仓库

关于 unreal-thirdparty

面向 Unreal Engine C++ 插件开发者的第三方库集成参考,涵盖链接方案、平台与 ABI 限制、打包方式及常见构建问题。

主要功能

  1. 01静态与动态库链接方案
  2. 02Build.cs 属性与模块配置
  3. 03平台 ABI 与打包指导
  4. 04隔离编译设置的屏障模块
  5. 05常见集成问题与 UE 版本变更

适用场景

  1. 01为 Unreal Engine 插件接入预编译库
  2. 02打包 DLL 和其他运行时依赖
  3. 03排查链接器或平台 ABI 故障

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/maystudios/claude-skills --skill unreal-thirdparty

安装后在 Claude Code 中输入/unreal-thirdparty确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
build-system.md
linking-patterns.md
patterns-and-pitfalls.md
platform-specifics.md

详细介绍

Unreal Engine 第三方库集成——C++ 指南

官方文档(请始终查阅以获取最新详情)

来源URL
Epic:集成第三方库https://dev.epicgames.com/documentation/unreal-engine/integrating-third-party-libraries-into-unreal-engine
Epic 社区:静态库 + Blueprint 教程https://dev.epicgames.com/community/learning/tutorials/0yJy/unreal-engine-fab-c-creating-your-own-3rd-party-function-library-and-using-it-in-blueprints
UE 论坛:了解其工作原理https://forums.unrealengine.com/t/adding-third-party-libraries-to-unreal-understanding-how-this-works/211244
georgy.dev:第三方集成https://georgy.dev/posts/third-party-integration/
unrealcode.net:封装库https://www.unrealcode.net/WrappingALibrary/
Linux ABI / Sysroot 指南https://pgaleone.eu/2023/06/18/unreal-engine-third-party-linux-sysroot-dependencies/
GitHub:Boost/PCL 插件示例https://github.com/ValentinKraft/Boost_PCL_UnrealThirdPartyPlugin
GitHub:UnrealImGui(参考实现)https://github.com/IDI-Systems/UnrealImGui
引擎第三方源代码Engine/Source/ThirdParty/(打包前请先检查此处——Epic 已提供 libcurl、zlib、libpng、OpenSSL 等)
更多社区资源
来源URL
UE 社区 Wiki:从头创建自定义第三方库https://unrealcommunity.wiki/adding-custom-third-party-library-to-plugin-from-scratch-867b28
Yulong He:DLL 插件 + 打包(Medium)https://yulonghe.medium.com/ue5-how-to-create-a-plugin-that-works-with-dlls-packaging-and-external-files-11f8ff9d7491
Marieke van Neutigem:将插件更新至 UE5https://mariekevanneutigem.nl/blog/pV20/updating-a-plugin-with-third-party-library-for-ue5
Adam Rehn:跨平台 + Conanhttps://adamrehn.com/articles/cross-platform-library-integration-in-unreal-engine-4/
Parallelcube:移动端/桌面端第三方库https://www.parallelcube.com/2018/03/01/using-thirdparty-libraries-in-our-ue4-mobile-project/
AGX Dynamics:Barrier 模块模式https://us.download.algoryx.se/AGXUnreal/documentation/current/agx-api-access.html
GitHub:UE4CMake(CMake 集成)https://github.com/caseymcc/UE4CMake
GitHub:CMakeUnrealhttps://github.com/kaustubh138/CMakeUnreal
GitHub:UnrealMacroNukehttps://github.com/hiili/UnrealMacroNuke
GitHub:UnrealNlohmannJsonhttps://github.com/dclipca/UnrealNlohmannJson
GitHub:shadowmint/ue4-static-pluginhttps://github.com/shadowmint/ue4-static-plugin
GitHub:iFunFactory Funapi(多平台)https://github.com/iFunFactory/engine-plugin-ue4
Satisfactory Modding:第三方库https://docs.ficsit.app/satisfactory-modding/latest/Development/Cpp/thirdparty.html
slowburn.dev:UE 升级(Build.cs 更改)https://slowburn.dev/dataconfig/Advanced/UEUpgrades.html
alain.xyz:使用第三方库https://alain.xyz/blog/ue4-working-with-3rd-party-libraries
dawnarc.com:Build.cs 说明https://dawnarc.com/2019/01/ue4build.cs-notes/
ikrima.dev:揭秘构建文件https://ikrima.dev/ue4guide/archived_content/unreal-engine-4-build-file-demystified-dmitry-yanovsky/
ikrima.dev:链接外部 DLLhttps://ikrima.dev/ue4guide/build-guide/plugins-modules/linking-external-dlls-or-libraries/
gg-labs:链接 DLLhttps://unreal.gg-labs.com/wiki-archives/devops/linking-dlls
conan-ue4cli 文档https://docs.adamrehn.com/conan-ue4cli/read-these-first/introduction-to-conan-ue4cli

插件模板

UE 提供 Third Party Library 插件模板。在编辑器中选择:Plugins > New Plugin > Third Party Library(滚动到底部)。这会生成基于 DLL 的集成所需的脚手架。对于静态库,在 Build.cs 中采用两行配置更简单。

核心架构

完整的 Build.cs 参考(包含所有属性和路径变量)请参阅 references/build-system.md。

集成流程:

Third-Party Source (or prebuilt binaries)
  |
  v
[Optional: Recompile with UE toolchain for ABI compat]
  |
  v
Place headers + libs in Plugin/Source/ThirdParty/
  |
  v
Create External Module (.Build.cs with ModuleType.External)
  |-- PublicIncludePaths        -> header directories
  |-- PublicAdditionalLibraries -> .lib / .a files
  |-- PublicDelayLoadDLLs       -> DLL names (Windows delay-load)
  |-- RuntimeDependencies       -> .dll / .so / .dylib staging
  |-- PublicDefinitions         -> preprocessor macros
  v
Consumer Module depends on External Module
  |-- PublicDependencyModuleNames.Add("MyThirdPartyLib")
  |-- #include with THIRD_PARTY_INCLUDES_START/END
  v
Use library API in UE C++ code

推荐的目录结构:

MyPlugin/
  MyPlugin.uplugin
  Source/
    MyPlugin/                        # Runtime module (your code)
      MyPlugin.Build.cs
      Private/
      Public/
    ThirdParty/
      MyLibrary/                     # External module (no source)
        MyLibrary.Build.cs           # Type = ModuleType.External
        include/                     # Library headers
        lib/
          Win64/  *.lib
          Linux/  *.a or *.so
          Mac/    *.a or *.dylib
  Binaries/
    ThirdParty/MyLibrary/Win64/      # DLLs (if dynamic linking)

四种集成方式

每种方式的详细代码示例请参阅 references/linking-patterns.md。

方式适用场景Build.cs 属性
静态库最简单;单个可执行文件;无需分发 DLLPublicAdditionalLibraries
动态库 + 导入库DLL 在编译时解析符号PublicAdditionalLibraries + PublicDelayLoadDLLs + RuntimeDependencies
动态库,无导入库通过 GetDllExport 在运行时查找函数指针仅 RuntimeDependencies
多平台静态库为各个平台提供单独库文件的跨平台插件PublicAdditionalLibraries,配合 Target.Platform 分支

库文件类型

平台静态库动态库导入库前缀
Windows.lib.dll.lib无
Linux / Android.a.so不适用lib
macOS / iOS.a.dylib不适用lib

Build.cs 快速参考

属性用途
Type = ModuleType.External模块封装预编译库,不编译 UE 源代码
PublicIncludePaths头文件搜索目录
PublicSystemIncludePaths与上项相同,但会抑制这些头文件产生的警告
PublicAdditionalLibraries静态库 / 导入库文件路径
PublicDelayLoadDLLs用于 Windows 延迟加载的 DLL 文件名
RuntimeDependencies打包时与可执行文件一同暂存的文件
PublicDefinitions预处理器定义("WITH_MYLIB=1")
PublicFrameworksmacOS 框架
bUseRTTI启用 RTTI(Boost 和某些 C++ 库所必需)
bEnableExceptions启用 C++ 异常(许多库所必需)
bForceEnableRTTI在整个引擎范围内强制启用 RTTI(在 TargetRules 中)

平台特定注意事项

有关 Windows DLL 加载、macOS @rpath/dylib 以及 Linux ABI/sysroot 的详细信息,请参阅 references/platform-specifics.md。

关键规则:

  • Windows: 只能按名称查找 DLL(导入表中没有路径)。使用 FPlatformProcess::GetDllHandle() 或延迟加载。UE 会搜索 Engine/Project/Plugin 的 Binaries/Win64/ 目录。
  • macOS: Dylib 使用 @rpath 安装名称。使用 install_name_tool -id @rpath/libfoo.dylib 设置。UBT 会自动添加 RPATH 条目。
  • Linux: 必须使用 UE 的 Clang + libc++(而非系统 libstdc++)重新编译 C++ 库。C 库(ABI 稳定)无需重新编译。使用 UE 的 CMake 工具链文件。

常见模式与陷阱

请参阅 references/patterns-and-pitfalls.md,了解实现方案、关键陷阱和故障排查方法。

关键陷阱:

  • UE 的 check 宏会与使用 check 作为标识符的第三方代码冲突——使用 #undef check 或封装 include
  • 使用 /MD 编译(多线程 DLL),以匹配 UE 的运行时——CRT 不匹配会导致链接器错误
  • RTTI + 异常默认关闭——Boost、PCL 和许多 C++ 库都要求在 External 模块和每个使用该模块的模块中设置 bUseRTTI = true 和 bEnableExceptions = true
  • 仅使用 Release 库——UE 使用 Release CRT;使用 Debug 构建的库会导致 _ITERATOR_DEBUG_LEVEL 不匹配和访问冲突
  • VS 项目设置会被忽略——只有 .Build.cs 才重要;Visual Studio 属性对 UBT 毫无影响
  • Binaries/ThirdParty/ 不会重新生成——如果删除,模板中的 DLL 就会丢失;UBT 无法重新构建它们
  • Linux ABI 不匹配——使用 libstdc++ 编译的 C++ 库,其符号修饰与 UE 的 libc++ 不同

UE 版本特定的 Build.cs 更改

请参阅 references/build-system.md,了解完整的逐版本变更日志。

影响第三方集成的关键破坏性变更:

  • UE 5.0:FVector 改为 3 个 double;TObjectPtr 取代原始 UObject 指针
  • UE 5.2:bEnforceIWYU(bool)改为 IWYUSupport(enum)
  • UE 5.3:BuildSettingsVersion.V4 默认使用 C++20;TRemoveConst 弃用,改用 std::remove_const
  • **UE 5.4:**MSVC 默认警告级别改为 /W4;FText 内部实现从 TSharedRef 改为 TRefCountPtr
  • **UE 5.5:**新的 Engine/Build/BatchFiles/RunUBT 脚本取代直接调用 UBT;不再需要 PER_MODULE_BOILERPLATE;StructUtils 插件已弃用(移至引擎)
  • UE 5.6:FString::Appendf 强制使用 static constexpr 格式字符串;GMalloc 访问已弃用
  • UE 5.7:FindObject 弃用 bExactClass,改用 EFindObjectFlags

高级模式

Barrier 模块(隔离不兼容的编译器设置)

当第三方库要求设置 bUseRTTI = true 和 bEnableExceptions = true,但你希望尽可能缩小影响范围时,可以创建一个 barrier 模块,通过干净的接口隔离该库:

Plugin/
  Source/
    ThirdParty/MyLib/          # ModuleType.External (headers + libs)
    MyLibBarrier/              # Barrier module (bUseRTTI=true, bEnableExceptions=true)
      Public/  -> clean types only, no third-party headers, no UObject.h
      Private/ -> wraps third-party includes with BeginIncludes/EndIncludes
    MyPlugin/                  # Main module, depends on MyLibBarrier (NOT on MyLib directly)

barrier 模块的公共头文件不得包含第三方头文件或触发包含 UObject.h。所有第三方类型都以不透明的 barrier 类型传递。请参阅 AGX Dynamics 文档中的生产环境示例。

通过 UE4CMake 集成 CMake

UE4CMake 插件提供 CMakeTarget.add(),可在 Build.cs 中将 CMake 库作为 UBT 的一部分进行构建:

CMakeTarget.add(Target, this, "TargetName",
    Path.Combine(ModuleDirectory, "../Libs/Source"),
    "-DCUSTOM_OPTION=ON", false);

它会根据 CMake 输出自动填充 PublicIncludePaths 和 PublicAdditionalLibraries,将源文件注册到 ExternalDependencies 以检测更改,并通过 PRAGMA_PUSH_PLATFORM_DEFAULT_PACKING / PRAGMA_POP_PLATFORM_DEFAULT_PACKING 处理结构体打包。

UnrealMacroNuke(全面清除宏污染)

对于会与 check 之外的许多 UE 宏冲突的库,UnrealMacroNuke 会生成成对的头文件,用于取消定义和重新定义所有冲突宏:

#pragma warning(push)
#pragma warning(disable: <codes>)
#include "UndefineMacros_UE_5.3.h"
#include "third_party/library.hpp"
#include "RedefineMacros_UE_5.3.h"
#pragma warning(pop)
Conan 包管理器集成

conan-ue4cli 包可自动针对 UE 捆绑的依赖项构建第三方库。Build.cs 会调用 conan install,并解析 conanbuildinfo.json 以提取 include 路径、库路径和定义。当 UE 和第三方库依赖同一库的不同版本(例如 zlib、libpng)时,这是解决符号插入问题的关键。

Android APL(Android 打包层)

Android 第三方库需要 APL XML 文件,以部署原生库并集成 Java:

// Build.cs -- Android
AdditionalPropertiesForReceipt.Add("AndroidPlugin",
    Utils.MakePathRelativeTo(
        Path.Combine(ThirdPartyPath, "LIBRARY_APL.xml"),
        Target.RelativeEnginePath));
用于变更检测的 ExternalDependencies

注册外部文件,以便在文件修改时触发重新构建:

ExternalDependencies.Add(Path.Combine(ModuleDirectory, "include", "version.h"));

这样可确保指定文件发生变化时,UBT 会重新生成 makefile,适用于跟踪标头文件或库二进制文件的更新。

AddEngineThirdPartyPrivateStaticDependencies

使用引擎捆绑的库,无需维护自己的副本:

AddEngineThirdPartyPrivateStaticDependencies(Target, "OpenSSL", "libWebSockets", "libcurl", "zlib");

这是使用引擎已附带库的首选方式。

评论

支持 Markdown