福感科技有限公司 欢迎您!
技术支持
联系方式

    地址:北京市平谷区马坊镇金河北街17号院3号楼7层712

    电话:010-89968230

    网站:http://www.fgsense.com

你的位置:首页 > 技术支持

虚幻引擎UE4如何链接第三方库(lib和dll)

2021-5-11 20:00:47      点击:
在开发中经常遇到的问题就是加入某第三方库的支持,这样的第三方库往往属于无源码,而且可能是静态lib或者是动态dll甚至两者皆有。UE4的编译管理用的是自己的UBT(unreal binary tool)因此链接第三方库的工作主要是编写UBT脚本。
1.以插件方式集成.
基本上这个是优先推荐的集成第三方库的方式,因为能够很好的隔离你的代码和第三方代码的影响,在UE4的源码里也可以看到很多第三方库都是这么集成的,比如paper2D,leapmotion等等。在UE4中新建插件的方式略去不表,当你新建完你的插件之后,你会在插件的代码目录下看到一个xxx.build.cs
接下来要做的就是修改这个脚本:
得到当前路径
  1. private string ModulePath
  2. {
  3.    get { return ModuleDirectory; }
  4. }

关于第三方库放的位置,一般是在plugin的源码同级文件夹下建一个ThirdParty文件夹,里面放上include lib等等。

得到ThirdParty文件夹的路径

  1. private string ThirdPartyPath
  2. {
  3.         get { return Path.GetFullPath(Path.Combine(ModulePath,"../../ThirdParty/")); }
  4. }
为工程添加include第三方库的头文件路径
在模快的构造函数里加上:
  1. PublicIncludePaths.AddRange(
  2.         new string[] { 
  3.              Path.Combine(ThirdPartyPath, "xxx", "Include"),
  4.         }
  5.         );
  6.             
  7.  
  8. PrivateIncludePaths.AddRange(
  9.         new string[] {
  10.             Path.Combine(ThirdPartyPath, "Foxit", "Include"),
  11.         }
  12.         );
链接第三方库的Lib
接下来需要在编译工程时加入第三方静态库的链接,静态链接属于工程在编译期间做的事情,因此这块需要通过cs脚本完成,而dll动态链接库的加载是运行期的事,因此需要在cpp文件中执行。
我们新建一个叫LoadxxxLib的函数,并把它放在模块的构造函数结尾执行:
  1. public bool LoadxxxLib(TargetInfo Target)
  2.     {
  3.         bool isLibararySupported = false;
  4.         if ((Target.Platform == UnrealTargetPlatform.Win64) || (Target.Platform == UnrealTargetPlatform.Win32))
  5.         {
  6.             isLibararySupported = true;
  7.             string PlatformString = (Target.Platform == UnrealTargetPlatform.Win64) ? "Win64" : "Win32";
  8.             PublicAdditionalLibraries.Add(Path.Combine(LibraryPath, PlatformString + ".lib"));
  9.             PublicDelayLoadDLLs.Add(PlatformString + ".dll");
  10.             RuntimeDependencies.Add(new RuntimeDependency(LibraryPath + PlatformString + ".dll"));
  11.         }
  12.         return isLibararySupported;
  13.     }

这样就可以保证在编译期链接上我们的第三方lib。


链接动态DLL
这个工作需要在plugin的运行期完成,在插件的source文件下找到一个与插件名字同名的cpp文件打开。会看到一个StartupModule的函数,我们需要在这里得到dll文件的handle。

在StartupModule中添加下面的代码:

  1. void FXXXModule::StartupModule()
  2. {
  3. #if PLATFORM_64BITS
  4.     FString platform = TEXT("win64.dll");
  5. #else
  6.     FString platform = TEXT("win32.dll");
  7. #endif
  8.     FString path = IPluginManager::Get().FindPlugin("XXX")->GetBaseDir(); 
  9.     FString dllpath = path + "/ThirdParty/XXX/Lib/" + platform;
  10.     PdfDllHandle = FPlatformProcess::GetDllHandle(*dllpath);
  11.     if (!PdfDllHandle)
  12.     {
  13.         UE_LOG(LogTemp, Warning, TEXT("Failed to load PDF library."));
  14.     }
  15. }
这里我们用的是PluginManager找到的插件所在的路径,值得注意的是使用这个函数时需要在build.cs中加入
  1. PrivateDependencyModuleNames.AddRange(
  2.             new string[]
  3.             {
  4.                 ...
  5.                 "Projects",
  6.             }
  7.             );

否则工程会链接出错。

Copyright 2019 www.fgsense.com

福感科技有限公司 版权所有 All Rights Reserved

京ICP备20002031号

010-89968230