中文字幕无码a片久久,亚洲日韩在线观看浪潮,人人超人人超碰超国产二区,国产人妻久久一区二区,国产人妻久久一区二区

福感科技有限公司 歡迎您!
技術(shù)支持
聯(lián)系方式

    地址:北京市平谷區(qū)馬坊鎮(zhèn)金河北街17號(hào)院3號(hào)樓7層712

    電話:010-89968230

    網(wǎng)站:http://0743119.com

你的位置:首頁 > 技術(shù)支持

虛幻引擎UE4如何鏈接第三方庫(lib和dll)

2021-5-11 20:00:47??????點(diǎn)擊:
在開發(fā)中經(jīng)常遇到的問題就是加入某第三方庫的支持,這樣的第三方庫往往屬于無源碼,而且可能是靜態(tài)lib或者是動(dòng)態(tài)dll甚至兩者皆有。UE4的編譯管理用的是自己的UBT(unreal binary tool)因此鏈接第三方庫的工作主要是編寫UBT腳本。
1.以插件方式集成.
基本上這個(gè)是優(yōu)先推薦的集成第三方庫的方式,因?yàn)槟軌蚝芎玫母綦x你的代碼和第三方代碼的影響,在UE4的源碼里也可以看到很多第三方庫都是這么集成的,比如paper2D,leapmotion等等。在UE4中新建插件的方式略去不表,當(dāng)你新建完你的插件之后,你會(huì)在插件的代碼目錄下看到一個(gè)xxx.build.cs
接下來要做的就是修改這個(gè)腳本:
得到當(dāng)前路徑
  1. private string ModulePath
  2. {
  3.    get { return ModuleDirectory; }
  4. }

關(guān)于第三方庫放的位置,一般是在plugin的源碼同級(jí)文件夾下建一個(gè)ThirdParty文件夾,里面放上include lib等等。

得到ThirdParty文件夾的路徑

  1. private string ThirdPartyPath
  2. {
  3.         get { return Path.GetFullPath(Path.Combine(ModulePath,"../../ThirdParty/")); }
  4. }
為工程添加include第三方庫的頭文件路徑
在??斓臉?gòu)造函數(shù)里加上:
  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
接下來需要在編譯工程時(shí)加入第三方靜態(tài)庫的鏈接,靜態(tài)鏈接屬于工程在編譯期間做的事情,因此這塊需要通過cs腳本完成,而dll動(dòng)態(tài)鏈接庫的加載是運(yùn)行期的事,因此需要在cpp文件中執(zhí)行。
我們新建一個(gè)叫LoadxxxLib的函數(shù),并把它放在模塊的構(gòu)造函數(shù)結(jié)尾執(zhí)行:
  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。


鏈接動(dòng)態(tài)DLL
這個(gè)工作需要在plugin的運(yùn)行期完成,在插件的source文件下找到一個(gè)與插件名字同名的cpp文件打開。會(huì)看到一個(gè)StartupModule的函數(shù),我們需要在這里得到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找到的插件所在的路徑,值得注意的是使用這個(gè)函數(shù)時(shí)需要在build.cs中加入
  1. PrivateDependencyModuleNames.AddRange(
  2.             new string[]
  3.             {
  4.                 ...
  5.                 "Projects",
  6.             }
  7.             );

否則工程會(huì)鏈接出錯(cuò)。

Copyright 2019 0743119.com

福感科技有限公司 版權(quán)所有 All Rights Reserved

京ICP備20002031號(hào)

010-89968230