以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.pswp.cn/bicheng/76006.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76006.shtml
英文地址,請注明出處:http://en.pswp.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;它負責解…