在C++中,通常我们这样去调用,首先添加头文件路径和库文件路径并且将dll文件复制在输出目录下,然后在程序中添加一行代码,#pragma comment(lib, "mylib.lib"),接着就能正常调用了,但在打包之后就不行了。其实UE4有自己的一套调用Dll的方法,他通常用C#去管理上面的一堆事情。
那么我们要在UE5里面去调用第三方库该如何实现呢,其实和C++的调用逻辑差不多
首先准备好必要的三个文件,.h,.lib和.dll,然后用C#语言去告诉编译器我们的.h和.lib两个文件的路径,将dll文件放在输出目录下,最后在项目中引入头文件就能正常调用了
程序源码和打包后的项目
链接:https://pan.baidu.com/s/107PXU2PLVfyjPtRpLL7_-g
提取码:5678
下面我来演示一下具体的调用过程(用的是UE5和vs2022,其他版本也行,也适用ue4)
这只是一种方法,还有其他方法,比如做成模块,做成插件,再如动态调用,但我个人认为我下面的静态调用是我感觉最好用的方法
一.创建DLL库文件
我直接创建了一个空项目,项目属性改成了DLL,里面只有两个文件,一个.h和一个.cpp,具体代码如下,最后会生成三个所需的文件
//dll1.h
#ifndef DLL1_H
#define DLL1_H
#define FENGZHUANGCPP_API __declspec(dllexport)
class FENGZHUANGCPP_API Face
{
public:
static Face* CreateFace();
virtual int Add(int a,int b) = 0;
virtual int num(int a) = 0;
};
#endif
//dll1.cpp
#include"dll1.h"
using namespace std;
class Face1 : public Face
{
public:
virtual int Add(int a, int b);
virtual int num(int a) ;
};
Face* Face::CreateFace()
{
return new Face1;
}
int Face1::Add(int a, int b)
{
return a+b;
}
int Face1::num(int a)
{
return a+1;
}
所需的文件
至此,第一步完成
二.UE4项目中引入第三方库文件
2.1放置文件
在项目目录E:\UE5\MyProject3\Source\MyProject3新建一个文件夹ThirdParty,在ThirdParty文件夹里面新建两个文件夹include和lib,将准备好的头文件dll1.h放入include,将库文件的dll1.lib放入lib,将dll1.dll放在E:\UE5\MyProject3\Binaries\Win64下面
2.2添加C#代码
在dll1.h中,将dllexport替换为dllImport。不改问题不大
打开MyProject3.Build.cs文件
添加以下三段代码
using System.IO;
private string ModulePath
{
get
{
return ModuleDirectory;
}
}
private string ThirdPartyPath
{
get
{
return Path.GetFullPath(Path.Combine(ModulePath, "ThirdParty"));
}
}
//PublicIncludePaths为 通向此模块内部包含文件的所有路径的列表,不向其他模块公开(至少有一个包含到Private 路径,如果要避免相对路径,则会更多)
PublicIncludePaths.Add(Path.Combine(ThirdPartyPath, "include"));
//附加库列表,PublicAdditionalLibraries是一组包含其他预编译库的列表(.lib文件的名称列表,包含后缀)...
PublicAdditionalLibraries.Add(Path.Combine(ThirdPartyPath, "lib", "Dll1.lib"));
添加完成后的MyProject3.Build.cs
// Fill out your copyright notice in the Description page of Project Settings.
using UnrealBuildTool;
using System.IO;
public class MyProject3 : ModuleRules
{
private string ModulePath
{
get
{
return ModuleDirectory;
}
}
private string ThirdPartyPath
{
get
{
return Path.GetFullPath(Path.Combine(ModulePath, "ThirdParty"));
}
}
public MyProject3(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });
PrivateDependencyModuleNames.AddRange(new string[] { });
// Uncomment if you are using Slate UI
// PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
// Uncomment if you are using online features
// PrivateDependencyModuleNames.Add("OnlineSubsystem");
// To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true
//PublicIncludePaths为 通向此模块内部包含文件的所有路径的列表,不向其他模块公开(至少有一个包含到Private 路径,如果要避免相对路径,则会更多)
PublicIncludePaths.Add(Path.Combine(ThirdPartyPath, "include"));
//附加库列表,PublicAdditionalLibraries是一组包含其他预编译库的列表(.lib文件的名称列表,包含后缀)...
PublicAdditionalLibraries.Add(Path.Combine(ThirdPartyPath, "lib", "Dll1.lib"));
}
}
到此路径问题用C#就配置结束
2.2在UE4项目中使用
添加一个蓝图函数库的C++类
添加如下代码
UFUNCTION(BlueprintCallable, Category = "My Library")
static int BFL_Add(int num,int a1);
#include"../ThirdParty/include/dll1.h"
int UMyBlueprintFunctionLibrary::BFL_Add(int num, int a1)
{
Face* fa = Face::CreateFace();
return fa->Add(num,a1);
}
2.3测试一下
调用我们的函数
执行结果如下
2.4打包一下
打包完成之后是没有我们自定义创建的DLL文件的,需要手动添加
Dll1.dll放入如下路径Binaries/Win64/
注意 一定是与exe文件放在同级目录的
看看打包之后的运行效果,还是不错的哈
至此结束。
我是参考下面两篇写的,他们写的还是不错的
http://t.csdn.cn/Db6aL文章来源:https://www.toymoban.com/news/detail-412596.html
http://t.csdn.cn/OlrGf文章来源地址https://www.toymoban.com/news/detail-412596.html
到了这里,关于UE5调用第三方DLL库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!