下面创建一个第三人称模板的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文件。