以UE5第三方插件库为基础,编写自己的第三方库插件,并且能够在运行时复制.dll

首先,创建一个空白的C++ 项目,创建第三方插件库。如下图所示
在这里插入图片描述
编译自己的.Dll 和.lib 库,打开.sln 如下图
在这里插入图片描述
ExampleLibrary.h 的代码如下

#if defined _WIN32 || defined _WIN64
#define EXAMPLELIBRARY_IMPORT __declspec(dllimport)
#elif defined __linux__
#define EXAMPLELIBRARY_IMPORT __attribute__((visibility("default")))
#else
#define EXAMPLELIBRARY_IMPORT
#endifEXAMPLELIBRARY_IMPORT void ExampleLibraryFunction();
EXAMPLELIBRARY_IMPORT int AddNumbersFunction(int a,int b);

ExampleLibrary.cpp 的代码如下

#if defined _WIN32 || defined _WIN64#include <Windows.h>#define EXAMPLELIBRARY_EXPORT __declspec(dllexport)
#else#include <stdio.h>
#include "ExampleLibrary.h"
#endif#ifndef EXAMPLELIBRARY_EXPORT#define EXAMPLELIBRARY_EXPORT
#endifEXAMPLELIBRARY_EXPORT void ExampleLibraryFunction()
{
#if defined _WIN32 || defined _WIN64MessageBox(NULL, TEXT("Loaded ExampleLibrary.dll from Third Party Plugin sample."), TEXT("Third Party Plugin"), MB_OK);
#elseprintf("Loaded ExampleLibrary from Third Party Plugin sample");
#endif
}EXAMPLELIBRARY_EXPORT int AddNumbersFunction(int a,int b)
{return a+b;
}

然后编译.Dll 库,配置如下
在这里插入图片描述
然后点击生成解决方案,编译成功后,如下图所示
在这里插入图片描述
创建蓝图库函数,运行时放在 插件中,如下图所示
在这里插入图片描述
在这里插入图片描述
要在WlThirdPartyLibrary.Build.cs 添加 “Engine”,“CoreUObject”,否则编译不成功
如下图
在这里插入图片描述
在蓝图库函数里面调用.Dll 里面得函MyBlueprintFunctionLibrary.h的代码如下

// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "MyBlueprintFunctionLibrary.generated.h"/*** */
UCLASS()
class WLTHIRDPARTYLIBRARY_API UMyBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{GENERATED_BODY()
public:UFUNCTION(BlueprintCallable,Category="Function")static int AddNumbers(int a, int b);
};

MyBlueprintFunctionLibrary.cpp 的代码如下

// Fill out your copyright notice in the Description page of Project Settings.#include "MyBlueprintFunctionLibrary.h"
#include "WlThirdPartyLibraryLibrary/ExampleLibrary.h"
int UMyBlueprintFunctionLibrary::AddNumbers(int a, int b)
{return AddNumbersFunction(a, b);
}

WlThirdPartyLibraryLibrary.Build.cs 的代码修改比较大,添加了自动复制.dll 的功能,代码如下

// Fill out your copyright notice in the Description page of Project Settings.using System.IO;
using UnrealBuildTool;public class WlThirdPartyLibraryLibrary : ModuleRules
{public WlThirdPartyLibraryLibrary(ReadOnlyTargetRules Target) : base(Target){Type = ModuleType.External;PublicSystemIncludePaths.Add("$(ModuleDir)/Public");if (Target.Platform == UnrealTargetPlatform.Win64){// Add the import libraryPublicAdditionalLibraries.Add(Path.Combine(ModuleDirectory, "x64", "Release", "ExampleLibrary.lib"));// Delay-load the DLL, so we can load it from the right place firstPublicDelayLoadDLLs.Add("ExampleLibrary.dll");// Ensure that the DLL is staged along with the executableCopyDll(Path.Combine(ModuleDirectory, "x64", "Release", "ExampleLibrary.dll"));}else if (Target.Platform == UnrealTargetPlatform.Mac){PublicDelayLoadDLLs.Add(Path.Combine(ModuleDirectory, "Mac", "Release", "libExampleLibrary.dylib"));RuntimeDependencies.Add("$(PluginDir)/Source/ThirdParty/WlThirdPartyLibraryLibrary/Mac/Release/libExampleLibrary.dylib");}else if (Target.Platform == UnrealTargetPlatform.Linux){string ExampleSoPath = Path.Combine("$(PluginDir)", "Binaries", "ThirdParty", "WlThirdPartyLibraryLibrary", "Linux", "x86_64-unknown-linux-gnu", "libExampleLibrary.so");PublicAdditionalLibraries.Add(ExampleSoPath);PublicDelayLoadDLLs.Add(ExampleSoPath);RuntimeDependencies.Add(ExampleSoPath);}}private void CopyDll(string InFilePath){// string TargetDirectory = Path.GetFullPath(Path.Combine(PluginDirectory, "Binaries/ThirdParty", "WlThirdPartyLibraryLibrary", "Win64"));string TargetDirectory = Path.GetFullPath(Path.Combine(PluginDirectory, "Binaries/ThirdParty/WlThirdPartyLibraryLibrary/Win64"));//目标文件夹的路径string FileName = Path.GetFileName(InFilePath);//获得文件名字// Ensure that the DLL is staged along with the executableif (!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/WlThirdPartyLibraryLibrary/Win64/ExampleLibrary.dll");//运行时添加DLL}
}

还有最后一步,添加白名单WlThirdPartyLibrary.uplugin 的代码如下

{"FileVersion": 3,"Version": 1,"VersionName": "1.0","FriendlyName": "WlThirdPartyLibrary","Description": "","Category": "Other","CreatedBy": "","CreatedByURL": "","DocsURL": "","MarketplaceURL": "","SupportURL": "","CanContainContent": true,"IsBetaVersion": false,"IsExperimentalVersion": false,"Installed": false,"Modules": [{"Name": "WlThirdPartyLibrary","Type": "Runtime","LoadingPhase": "Default","WhitelistPlatforms": ["Win64"]}]
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/76006.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

正则表达式示例集合

目录&#xff1a; 1、精准匹配2、字符匹配3、参考示例3.1、一个合理的用户名正则表达式3.2、匹配 HTML 标签及内容3.3、其他示例3.4、微信号正则表达式3.5、QQ号正则表达式3.6、车牌号号正则表达式3.7、邮箱正则表达式 1、精准匹配 单字符模式&#xff0c;如 a&#xff0c;不论…

2025 年前端与后端开发方向的抉择与展望-优雅草卓伊凡

2025 年前端与后端开发方向的抉择与展望-优雅草卓伊凡 在 2025 年这个科技浪潮奔涌的时代&#xff0c;软件开发领域持续变革&#xff0c;前端与后端开发方向的抉择&#xff0c;成为众多从业者和爱好者亟待破解的关键命题。卓伊凡就频繁收到这样的疑问&#xff1a;“2025 年了&…

巧用数论与动态规划破解包子凑数问题

本文针对“包子凑数”问题&#xff0c;深入解析如何通过最大公约数&#xff08;GCD&#xff09;判断无法组成的数目是否无限&#xff0c;并结合动态规划高效求解有限情况下的具体数目。通过清晰的算法思路、代码实现及示例详解&#xff0c;揭秘数论与动态规划在组合问题中的巧妙…

什么是数据

一、数据的本质定义​​ ​​哲学视角​​ 亚里士多德《形而上学》中"未加工的观察记录"现代认知科学&#xff1a;人类感知系统接收的原始刺激信号&#xff08;如视网膜光信号、听觉神经电信号&#xff09;信息论奠基人香农&#xff1a;消除不确定性的度量载体 ​​…

FreeRTOS中互斥量实现数据共享优化

在 FreeRTOS 中&#xff0c;当读操作远多于写操作时&#xff0c;使用**互斥量&#xff08;Mutex&#xff09;会导致读任务频繁阻塞&#xff0c;降低系统性能。此时&#xff0c;可以通过实现读者-写者锁&#xff08;Reader-Writer Lock&#xff09;**优化&#xff0c;允许多个读…

国内虚拟电厂(VPP)管控平台供应商

以下是几家专注于虚拟电厂业务的供应商及其官网地址&#xff1a; 1. 华茂能联科技有限公司 官网地址&#xff1a;https://huamod.com/简介&#xff1a;华茂能联是分布式资源管理与虚拟电厂产品与服务提供商&#xff0c;团队汇聚了来自美国、欧洲和国内多个行业知名研究机构或…

协方差相关问题

为什么无偏估计用 ( n − 1 ) (n-1) (n−1) 而不是 n n n&#xff0c;区别是什么&#xff1f; 在统计学中&#xff0c;无偏估计是指估计量的期望值等于总体参数的真实值。当我们用样本数据估计总体方差或协方差时&#xff0c;分母使用 ( n − 1 ) (n-1) (n−1) 而不是 n n…

算法设计学习6

实验目的及要求&#xff1a; 目标是使学生学会分析数据对象的特点&#xff0c;掌握数据组织的方法和在计算机中的存储方式&#xff0c;能够对具体问题中所涉及的数据选择合适的逻辑结构、存储结构&#xff0c;进而在此基础上&#xff0c;对各种具体操作设计高效的算法&#xff…

Java 三大特性—多态

目录 1、多态的概念2、多态的条件3、向上转型3.1 概念3.2 使用场景 4、向下转型5、多态的优缺点 1、多态的概念 多态&#xff0c;通俗来讲就是多种形态&#xff0c;即对于同样的行为&#xff0c;不同的对象去完成会产生不同的状态。比如动物都会吃东西&#xff0c;小狗和小猫都…

Ubuntu 24.04 LTS系统安装RTX 4090显卡驱动和cuda并部署ollama下载DeepSeek模型【自用详细版】

自己捣鼓玩玩哈&#xff0c;正好有机子 1. 安装驱动前的系统配置工作 卸载原有驱动并禁用nouveau sudo apt remove --purge nvidia*sudo cp /etc/modprobe.d/blacklist.conf /etc/modprobe.d/blacklist.conf.backup //备份文件sudo vim /etc/modprobe.d/blacklist.conf //修…

【一篇搞定配置】一篇带你从配置到使用(PyCharm远程)完成服务器运行项目(配置、使用一条龙)【全网最详细版】

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;各种软件安装与配置_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1.…

Mamba模型

为什么要提出mamba模型&#xff1f; transformer特点&#xff1a;训练快&#xff0c;推理慢&#xff0c;计算成本O&#xff08;n*n&#xff09; Rnn的特点&#xff1a;训练慢&#xff0c;推理快&#xff0c;容易遗忘 其实很容易理解&#xff0c;因为RNN的输入只包含前一个隐…

如何在 Windows 11 上查找计算机的 IP 地址?

原文&#xff1a;如何在 Windows 11 上查找计算机的 IP 地址&#xff1f; | w3cschool笔记 在开始之前&#xff0c;我们先来了解一下什么是 IP 地址&#xff1a; 假设你住在一栋公寓楼里&#xff0c;快递员需要把包裹送到你家。为了确保快递能准确送到&#xff0c;你需要提供…

2.Spring-注解开发定义bean/纯注解开发/Spring整合MyBatis(p21-p30)

&#xff08;一&#xff09;注解开发定义bean &#xff08;二&#xff09;纯注解开发 &#xff08;三&#xff09;bean的作用范围 &#xff08;三&#xff09;xml配置和注解配置 &#xff08;四&#xff09;Spring整合MyBatis 要在pom.xml定义一下坐标。org.spr…

解决:Fontconfig head is null, check your fonts or fonts configurat

文章目录 问题解决方案安装字体依赖包强制刷新字体缓存验证是否生效 个人简介 问题 在使用 Java 环境部署或运行图形相关应用时&#xff0c;比如图片验证码&#xff0c;偶尔会遇到如下报错&#xff1a; Fontconfig head is null, check your fonts or fonts configurat意味当…

『不废话』之Llama 4实测小报

2025年4月5日Llama 4一开源&#xff0c;随后OpenRouter等平台就提供免费调用。对于中文社区来&#xff0c;官方的测评结果其实意义不大&#xff08;原因先按下不表&#xff09;&#xff0c;就看知乎、微博、B站、twitter上的真实感受&#xff0c;最重要的是自己的真实案例测评。…

【NLP 56、实践 ⑬ LoRA完成NER任务】

目录 一、数据文件 二、模型配置文件 config.py 三、数据加载文件 loader.py 1.导入文件和类的定义 2.初始化 3.数据加载方法 代码运行流程 4.文本编码 / 解码方法    ① encode_sentence()&#xff1a; ② decode()&#xff1a; 代码运行流程 ③ padding()&#xff1a; 代码…

八大排序——c++版

本次排序都是按照升序排的 冒泡排序 void bubbleSort(vector<int>& nums) {int nnums.size();for(int i0;i<n-1;i){bool swappedfalse;for(int j0;j<n-1-i;j){if(nums[j]>nums[j1]){swap(nums[j],nums[j1]);swappedtrue;}}if(!swapped)break;} } //算法原…

mlir-tblgen 的应用渐进式示例

示例01 -gen-dialect-decls toy_dia.1.toy include "mlir/IR/OpBase.td" //include "mlir/IR/FunctionInterfaces.td" //include "mlir/IR/SymbolInterfaces.td" //include "mlir/Interfaces/SideEffectInterfaces.td"def Toy_Diale…

Go语言从零构建SQL数据库(5)-Pratt解析算法:SQL表达式解析的核心引擎

Pratt解析算法&#xff1a;SQL表达式解析的核心引擎 1. 算法概述与工作原理 Pratt解析算法&#xff08;自顶向下运算符优先级解析&#xff09;是一种优雅的表达式解析方法&#xff0c;特别适合处理具有不同优先级运算符的复杂表达式。在我们的SQL解析器中&#xff0c;它负责解…