在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

http://t.csdn.cn/OlrGf

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐