【详细全流程】UE4调用第三方库 动态链接库 dll C++


2022/2/27
UE4.24/4.26/4.27均测试成功
VS2019/2022均测试成功

0 引言

近期做的一个虚幻4项目,涉及到非常复杂的数学物理计算,需要调用一个现成的C++库以计算。解决问题途中,我遇到了一些坑,查阅了一些文章,最终尝试成功。在这篇文章中,我会
1.简要提及动态调用法和我的补充
2.使用UE4.24,从一个空白工程开始到打包,一步一步详细介绍静态调用方法。
水平有限,欢迎建议和指正

1 动态调用(仅使用.dll文件)

参考了这位大哥的博文https://blog.csdn.net/qq_36409711/article/details/82112867确实成功了
但是据评论所言这种方法在打包之后会有一点路径上的问题,因为我的项目适合静态调用,说以我没有最后去测试打包之后的问题

我对C/C++库的建立作一点补充:
动态调用dll,只需要一个dll文件,方法是通过函数名称 找到dll里的函数,进行调用。许多文章里说为了避免名称错乱,要使用Cextern "C",目的是使用c编译保证名称不错乱。
这里需要解释C/C++的不同,C库不支持重载,而C++支持重载(存在多个不同参数的同名函数),因此C++的dll里面,函数名称前后会多一堆符号和字母来区分重载函数。
所以,要看情况考虑。如果你的库里有重载函数,那么不能使用C编译,必须是C++,当然调用方法也很简单,只需要使用dll查看工具查看生成的dll中的实际函数名称,接着在通过函数名称找函数的时候,使用函数实际完整的名称(前后带一堆字母符号的函数名)即可

2 静态调用(需要.h.dll.lib文件)

2.1 创建dll库

打开VS2019
选择动态链接库模板创建

在这里插入图片描述

命名Dll3
在这里插入图片描述
初始界面。自动生成的文件都不用改

在这里插入图片描述
我们要64位库,默认x86所以改成x64
在这里插入图片描述
新建DLL3.cpp文件
在这里插入图片描述

新建DLL3.h文件
在这里插入图片描述
简单做一个自增的函数
DLL3.h中如下代码
在这里插入图片描述

#pragma once
#define DLL_API  _declspec(dllexport)
//#define DLL_API extern "C"_declspec(dllimport)
DLL_API float Add(float num);

DLL3.cpp中如下代码
在这里插入图片描述

#include "pch.h"
#include "DLL3.h"
float Add(float num)
{
    
    
	return num + 1;
}

右键项目Dll3单击生成或者重新生成
在这里插入图片描述
单击 在文件资源管理器中打开文件夹
在这里插入图片描述
文件资源管理器x64/Debug/下
在这里插入图片描述
可以找到生成的.lib和.dll
在这里插入图片描述
到此dll库准备完毕

2.2 创建UE4项目

在这里插入图片描述
在这里插入图片描述

2.3 放入库文件

进入项目目录/Source/MyProject1,创建文件夹ThirdParty
在这里插入图片描述
在ThirdParty下创建include和lib
在这里插入图片描述

分别放入对应文件
.h放进include
在这里插入图片描述
.lib放进lib
在这里插入图片描述
将dll文件放入UE4项目文件夹下的Binaries/Win64
在这里插入图片描述

2.4 C++中的准备工作

使用VS2019打开UE4项目。ps:如果你用的是UE4.27,那么只能使用VS2022,因为VS2019不支持UE4.27
在这里插入图片描述
把DLL3.h文件添加进来
在这里插入图片描述
我把它放进了新建的ThirdParty筛选器中
在这里插入图片描述

在DLL3.h将dllexport替换为dllImport。其实不改也不会出问题,最好还是改了,详细可以百度dllexport和dllImport
在这里插入图片描述
找到.Build.cs
在这里插入图片描述
加入代码
在这里插入图片描述

	private string ModulePath
    {
    
    
        get
        {
    
    
            return ModuleDirectory;
        }

    }

    private string ThirdPartyPath
    {
    
    
        get
        {
    
    
            return Path.GetFullPath(Path.Combine(ModulePath, "ThirdParty"));
        }
    }

在public MyProject1(ReadOnlyTargetRules Target) : base(Target)里面加两句话
在这里插入图片描述

		//PublicIncludePaths为 通向此模块内部包含文件的所有路径的列表,不向其他模块公开(至少有一个包含到Private 路径,如果要避免相对路径,则会更多)
        PublicIncludePaths.Add(Path.Combine(ThirdPartyPath, "include"));
        //附加库列表,PublicAdditionalLibraries是一组包含其他预编译库的列表(.lib文件的名称列表,包含后缀)...
        PublicAdditionalLibraries.Add(Path.Combine(ThirdPartyPath, "lib", "DLL3.lib"));

上文用了Path,所以在前面加上using System.IO;
在这里插入图片描述

using System.IO;

到此准备完毕,可以使用库了

2.4 库的使用,以蓝图函数库为例

此处以蓝图函数库中的使用为例,别的地方同理即可

回到UE4界面,新建C++项目,选择蓝图函数库
在这里插入图片描述
在这里插入图片描述
回到VS2019,找到蓝图函数库的.h文件,加入代码
在这里插入图片描述
代码中"My Library"是自定义蓝图函数类名,之后我们在蓝图中可以根据这个名称来很方便地找到函数

public:
	UFUNCTION(BlueprintCallable, Category = "My Library")
		static float BFL_Add(float num);

找到蓝图函数库的.cpp文件,加入代码
在这里插入图片描述

#include "./ThirdParty/include/DLL3.h"
float UMyBlueprintFunctionLibrary::BFL_Add(float num)
{
    
    
	return Add(num);
}

上面的代码中使用了return返回值给蓝图
如果需要返回多个值,可以这样
在这里插入图片描述
在这里插入图片描述
编译一把测试
进入关卡蓝图测试库是否能正常使用
在这里插入图片描述
可以根据此前自定义名称的蓝图函数归类来查找我们的函数
在这里插入图片描述
简单测试
在这里插入图片描述
测试成功!
在这里插入图片描述

2.5 打包

接下来进行打包测试
在这里插入图片描述
随便选择一个目录打包
在这里插入图片描述

打包生成文件夹
在这里插入图片描述
必须把DLL3.dll放入如下路径Binaries/Win64/
在这里插入图片描述
双击运行
在这里插入图片描述
F11可以退出全屏,运行成功,库函数可以正常运行
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_47110957/article/details/123161674