成人免费黄色网_曰本女同videos_男女在线观看视频_在线亚洲黄色_欧美欧美欧美欧美_bestialityvideo另类最新

  • 您的位置:首頁 > 新聞動態 > UE4

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

    2018/3/20??????點擊:
    摘要:寫這個文章主要是被UE官方的wiki和answerhub誤導了很久,這本來是一個很常見和基本的問題,但是無論是官方的wiki或者是論壇上的提問都十分散亂并且充斥各種錯誤,因此記錄下這個在開發中時常遇到的問題。
    在開發中經常遇到的問題就是加入某第三方庫的支持,這樣的第三方庫往往屬于無源碼,而且可能是靜態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.             );

    否則工程會鏈接出錯。


    主站蜘蛛池模板: 奶大灬舒服一进一出视频 | 日韩欧美第一区 | 九九久久精品无码专区 | 91久久夜色精品国产网站app | 视频在线观看免费高清在线观看 | 亚洲成人在线网 | 奇米四色777久久爱 国产对白在线播放 | 伊人久久大香线蕉av桃 | 五月天午夜影院 | 丰满护士巨好爽好大乳小说 | 香港日本三级亚洲三级 | 国产精品免费看久久久软件 | 美女疯狂连续喷潮视频 | 久久另类ts人妖一区二区 | 我要看中国毛片 | 宅男666在线永久免费观看 | 国产精品视频系列 | 国产护士在线观看 | 亚洲乱色熟女一区二区三区麻豆 | 亚洲一区毛片 | 久久人妻无码中文字幕动图 | 欧美6699| 一本一本久久a久久精品综合妖精 | 亚洲乱亚洲乱妇20p 国产香蕉97碰碰视频碰碰看 | 69精品久久久久9999不卡片 | 视频二区中文字幕 | 午夜影院在线播放 | yell视频在线观看免费 | 国产午夜一区二区三区 | a级国产黄色片 | chinese新疆少妇sex | 日本中文字幕第一页 | 亚洲男人的天堂在线观看 | 天天拍拍天天干 | 91av精品 | 亚洲中文字幕无码av在线 | 黑人做爰xxxⅹ性欧美有限公司 | 欧美精选视频 | 国产精品一久久香蕉国产线看观看 | 制服丝袜国产在线无码 | 妞妞色www在线精品观看视频 |