如何修复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
相关产品推荐
相关产品推荐

