UE4:动态链接库和静态链接库的使用

下面创建一个第三人称模板的C++工程ThirdPerson,使用

UE4学习笔记:动态链接库和静态链接库的使用_少得多惑的博客-CSDN博客

一、静态链接库

在工程目录新建一个文件夹ThirdParty(与Content目录同一级),将xxx.h文件和xxx.lib文件复制到这个文件夹,接下来要在编译文件.build.cs文件中将这个目录添加到包含目录,使UE4能搜索到头文件(如果没有添加包含目录,头文件的路径就是../../ThirdParty/xxx.h),然后将xxx.lib添加到依赖库列表中,ThirdPerson.build.cs文件大致如下:

 
//ThirdPerson.Build.cs
using UnrealBuildTool;
using System.IO;
public class ThirdPerson : ModuleRules
{
    private string ThirdPartyPath
    {
        get { return Path.GetFullPath(Path.Combine(ModuleDirectory, "../../ThirdParty/")); }
    }
    public ThirdPerson(ReadOnlyTargetRules Target) : base(Target)
	{
		PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
		PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "HeadMountedDisplay", "ImageWrapper" });
        PublicIncludePaths.Add(Path.Combine(ThirdPartyPath));
        PublicAdditionalLibraries.Add(Path.Combine(ThirdPartyPath, "xxx.lib"));
		PublicDelayLoadDLLs.Add("xxx.dll");
    }
}

二、动态链接库

动态链接库同时需要将xxx.dll文件放到ThirdParty目录,使用动态链接库有两种方式,一种是通过.h和.lib文件直接调用,一种是只用dll文件通过查找函数地址来使用。

(1)通过.lib文件使用动态链接库

ThirdPerson.build.cs文件内容跟上面的差不多,只是要将dll文件添加到延迟加载列表PublicDelayLoadDLLs中,如果不添加就会在引擎启动的时候加载,导致出错(不知道还有没有其他的解决办法)。

 
//ThirdPerson.Build.cs
using UnrealBuildTool;
using System.IO;
public class ThirdPerson : ModuleRules
{
    private string ThirdPartyPath
    {
        get { return Path.GetFullPath(Path.Combine(ModuleDirectory, "../../ThirdParty/")); }
    }
    public ThirdPerson(ReadOnlyTargetRules Target) : base(Target)
	{
		PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
		PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "HeadMountedDisplay", "ImageWrapper" });
        PublicIncludePaths.Add(Path.Combine(ThirdPartyPath));
        PublicAdditionalLibraries.Add(Path.Combine(ThirdPartyPath, "xxx.lib"));
		PublicDelayLoadDLLs.Add("xxx.dll");
    }
}

在使用dll中的函数之前要通过调用PushDllDirectory函数将Thirdparty目录加入到dll搜索路径,否则找不到dll文件(如果将dll文件放到工程目录/Binaries\Win64下可以不调用)。

PushDllDirectory的添加如果是模块的引用的话在StartupModule()或者重载里面添加

void FKxFramework::StartupModule()
{
	FPlatformProcess::PushDllDirectory(*(FPaths::ProjectDir() / TEXT("Source/ThirdParty/xxx/")));
}

或者在GameMode里面添加


void AThirdPersonGameMode::StartPlay()
{
	Super::StartPlay();
	FPlatformProcess::PushDllDirectory(*(FPaths::ProjectDir() / TEXT("ThirdParty/")));//将dll存放目录加入搜索路径
}

(2)直接使用dll文件

直接使用dll文件来调用库中的函数只需要一个dll文件,.build.cs文件也不用改,可直接用GetDllExport通过函数名称从dll中取得需要调用的函数。


void AThirdPersonGameMode::StartPlay()
{
	Super::StartPlay();
	FPlatformProcess::PushDllDirectory(*(FPaths::ProjectDir() / TEXT("ThirdParty/")));//将dll存放目录加入搜索路径
	CaptureScreenHandle = FPlatformProcess::GetDllHandle(TEXT("xxx.dll"));//或者全路径FPaths::ProjectDir()/TEXT("ThirdParty/xxx.dll")
	}

but !

如果dll文件不依赖其他dll文件,GetDllHandle可传入dll文件的完整路径而不需要PushDllDirectory,但是如果dll还依赖于其他dll文件并且也在Thirdparty目录下就必须调用PushDllDirectory,否则找不到依赖的dll文件。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值