当前位置: 首页 > article >正文

【UE5 C++课程系列笔记】30——自动拷贝DLL及其他资源

前言

        在上一篇(【UE5 C++课程系列笔记】29——在UE中使用第三方库的流程)博客中,我们已经实现了在UE中使用外部的.dll文件。本篇博客将介绍在缺少“Binaries”和“Intermediate”文件夹的情况下,如何将.dll文件等外部资源自动拷贝,从而防止因为缺少外部资源而造成打包失败的情况

步骤

1. 可以看到项目插件所需要的第三方库的存放路径如下

在“xx项目\Plugins\MyThirdPartyLibrary\Source\ThirdParty\MyThirdPartyLibraryLibrary\MyThirdPartyLibraryLibrary.Build.cs”文件中,可以看到之前写了如下代码,其中第22行代码的作用是:将第三方库的DLL文件添加到Unreal Engine项目的运行时依赖中,确保在打包或运行游戏时,该DLL文件会被正确地复制到输出目录中(就是将打包之前路径下的文件拷贝到打包之后对应的路径下,“ RuntimeDependencies.Add()”中填入的路径是打包之前的路径)

复制后的DLL文件存放路径如下

因此,如果我们把“Binaries”和“Intermediate”文件夹从插件文件夹中移除将无法正确打包。

2. 为了解决上述问题,我们需要在“MyThirdPartyLibraryLibrary.Build.cs”文件中添加如下代码

        完整代码如下,其中函数CopyDllToPluginBinaries()的作用是将指定的DLL文件复制到插件的Binaries目录中,并确保该DLL文件在Unreal Engine项目打包或运行时被正确包含。传入的参数“InFilePath”表示需要复制的DLL文件的源路径。

// Fill out your copyright notice in the Description page of Project Settings.

using System;
using System.IO;
using UnrealBuildTool;

public class MyThirdPartyLibraryLibrary : ModuleRules
{
	private void CopyDllToPluginBinaries(string InFilePath, ReadOnlyTargetRules Target)
	{
        //确定目标目录
        string TargetDirectory = Path.GetFullPath(Path.Combine(PluginDirectory, "Binaries/ThirdParty", "MyThirdPartyLibraryLibrary", "Win64"));

        //获取文件名
        string FileName = Path.GetFileName(InFilePath);

        //打印源文件路径、目标目录和文件名
        Console.WriteLine("--SourceFilePath:" + InFilePath);
		Console.WriteLine("--TargetDirectory:" + TargetDirectory + "--FileName:" + FileName);

        //创建目标目录(如果不存在)
        if (!Directory.Exists(TargetDirectory))
		{
			Directory.CreateDirectory(TargetDirectory);
		}

        //复制文件
        string TargetFilePath = Path.Combine(TargetDirectory, FileName);
		if (!File.Exists(TargetFilePath))
		{
			File.Copy(InFilePath, TargetFilePath, true);
		}

        //将复制的DLL文件添加到运行时依赖中
        RuntimeDependencies.Add("$(PluginDir)/Binaries/ThirdParty/MyThirdPartyLibraryLibrary/Win64/ExampleLibrary.dll");
    }

	public MyThirdPartyLibraryLibrary(ReadOnlyTargetRules Target) : base(Target)
	{
		Type = ModuleType.External;
		PublicSystemIncludePaths.Add("$(ModuleDir)/Public");

		if (Target.Platform == UnrealTargetPlatform.Win64)
		{
			// Add the import library
			PublicAdditionalLibraries.Add(Path.Combine(ModuleDirectory, "x64", "Release", "ExampleLibrary.lib"));

			// Delay-load the DLL, so we can load it from the right place first
			PublicDelayLoadDLLs.Add("ExampleLibrary.dll");

			CopyDllToPluginBinaries(Path.Combine(ModuleDirectory, "x64", "Release", "ExampleLibrary.dll"), Target);

        }
	}
}

3. 此时我们再删除“Binaries”和“Intermediate”文件夹

删除后如下

重新编译一下 

编译后可以重新看到创建了“Binaries”和“Intermediate”文件夹

并且在“Binaries”中包含了所需的DLL文件

4. 打开“MyThirdPartyLibraryLibrary.Build.cs”

添加如下代码,表示只允许项目在Windows环境中打包


http://www.kler.cn/a/551952.html

相关文章:

  • vue3-03初学vue3中的配置项setup(Composition API (组合API组件中所用到的:数据、方法等,均要配置在setup中)
  • 大模型基础知识快问快答
  • 1、AI量化学习资料 - 用DEEPSEEK玩转PTrade策略开发.zip\AI量化学习资料 - 1、PTrade策略开发提示词(参考模板).md
  • 多线程编程的隐形陷阱:竞态、死锁与活锁的实战解决方案
  • ARM系统源码编译OpenCV 4.10.0(包含opencv_contrib)
  • 二十多年前的苹果电源Power Mac G4 Mdd 电源接口
  • 【Python项目】文本相似度计算系统
  • Android 通过 ADB 查看应用运行日志
  • ESP32 ESP-IDF TFT-LCD(ST7735 128x160)自定义组件驱动显示
  • 海康威视NVR DS-7816N-SN固件升级指南:安全、高效、无忧
  • 以下是一个使用 HTML、CSS 和 JavaScript 实现的登录弹窗效果示例
  • 【干货教程】DeepSeek R1+Open WebUI构建RAG检索增强知识库的实战教程
  • DeepSeek 助力 Vue 开发:打造丝滑的范围选择器(Range Picker)
  • 已弃用Flutter的Gradle插件的命令式应用
  • Java进阶篇之Lambda表达式
  • 蜂鸟视图发布AI智能导购产品:用生成式AI重构空间服务新范式
  • 数据库提权总结
  • 图像处理:如何把模糊变形的文档图像变清晰方正?
  • Django 5实用指南(二)项目结构与管理
  • C++ 设计模式-外观模式