You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复Unreal Build Tool未正确部署第三方DLL的问题

问题原因

Windows系统加载动态链接库时,会遵循固定的搜索顺序查找文件,默认不会递归扫描插件的Binaries子目录。打包后的游戏启动时,进程工作目录为游戏根目录,系统只会在以下路径查找DLL:

  • 游戏exe所在的Binaries/Win64目录
  • 系统系统目录
  • PATH环境变量包含的路径

你的配置仅将MyPluginLib.dll复制到了插件的Plugins/MyPlugin/Binaries/Win64目录,不在系统默认搜索范围内,因此启动时找不到文件。

编辑器内运行正常是因为Unreal Editor会自动将所有加载插件的Binaries目录加入DLL搜索路径,同时编辑器的工作目录和加载机制与打包后的独立游戏不同。

解决方案

方案1:将DLL打包到游戏Binaries目录(推荐)

修改Build.cs中的RuntimeDependencies配置,指定DLL的目标输出路径为游戏的平台Binaries目录,打包时会自动将DLL复制到游戏exe所在目录:

if ((Target.Platform == UnrealTargetPlatform.Win64))
{
    PublicAdditionalLibraries.Add(Path.Combine(LibraryDirectory, "MyPluginLib.lib"));
    // 源路径 -> 目标路径
    RuntimeDependencies.Add(
        Path.Combine(LibraryDirectory, "MyPluginLib.dll"),
        Path.Combine(Target.ProjectBinariesDirectory, PlatformString, "MyPluginLib.dll"),
        StagedFileType.NonUFS
    );
}

Target.ProjectBinariesDirectory会自动指向游戏项目的Binaries目录,结合平台字符串后,最终DLL会被放到MyGame/Binaries/Win64,和游戏exe同目录,系统可以直接找到。

方案2:添加插件Binaries目录到DLL搜索路径

如果希望保留DLL在插件目录内,可以通过延迟加载DLL并手动添加搜索路径的方式实现:

步骤1:修改Build.cs启用延迟加载

if ((Target.Platform == UnrealTargetPlatform.Win64))
{
    PublicAdditionalLibraries.Add(Path.Combine(LibraryDirectory, "MyPluginLib.lib"));
    RuntimeDependencies.Add(Path.Combine(LibraryDirectory, "MyPluginLib.dll"), StagedFileType.NonUFS);
    // 启用延迟加载
    DelayLoadDLLs.Add("MyPluginLib.dll");
    PublicDefinitions.Add("MYPLUGINLIB_DELAYLOAD=1");
}

步骤2:在插件模块启动时添加搜索路径

在插件的主模块类(如MyPlugin.cpp)的StartupModule方法中,添加插件Binaries目录到系统DLL搜索路径:

#include "Windows/WindowsPlatformProcess.h"
#include "Misc/Paths.h"
#include "MyPlugin.h"

void FMyPluginModule::StartupModule()
{
#if MYPLUGINLIB_DELAYLOAD
    // 构建插件Binaries目录路径
    FString PluginBinariesPath = FPaths::Combine(
        FPaths::PluginsDir(), 
        TEXT("MyPlugin"), 
        TEXT("Binaries"), 
        TEXT("Win64")
    );
    // 添加到DLL搜索目录
    FPlatformProcess::AddDllDirectory(*PluginBinariesPath);
#endif
}

void FMyPluginModule::ShutdownModule()
{
    // 可选:移除搜索目录(通常不需要,进程退出时会自动清理)
#if MYPLUGINLIB_DELAYLOAD
    FPlatformProcess::RemoveDllDirectory(*PluginBinariesPath);
#endif
}

IMPLEMENT_MODULE(FMyPluginModule, MyPlugin)

这样游戏启动时会先扫描插件的Binaries目录,就能找到MyPluginLib.dll。

额外说明
  • 插件的文件夹结构符合Unreal规范,问题不在结构本身,而是打包后的DLL搜索路径配置。
  • 测试时建议先清理旧的打包输出目录,避免缓存文件干扰。

内容的提问来源于stack exchange,提问作者goose_lake

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 11:01:04