在UE中引用第三方庫
創(chuàng)建包含第三方庫的插件
官方推薦的方法是通過第三方庫插件插件模板進行集成。

通過插件模板創(chuàng)建之後,我們會得到一個包含二個Module的Plugin目錄,其中一個是與Plugin同名的主模塊;另一個則是用來引用第三方庫的包裝模塊。這個包裝模塊和普通模塊一樣,具有最基本的三個文件ModuleName.cpp,ModuleName.h以及ModuleName.Build.cs。這種做法比較乾凈地對第三方庫進行了隔離。模板創(chuàng)建的示例模塊中清晰地標明了,這種模塊的類型需要被設(shè)置為ModuleType.External,如果在插件的主模塊中直接引用第三方庫,使用這種類型標識,會出現(xiàn)一個編譯錯誤:`XXX is not a C++ module (referenced via default plugins → XXX.uplugin)`。
在插件中引用第三方庫需要完成以下事務(wù)
1. 將第三方庫的頭文件和庫文件導入到Plugin中的子目錄下 。
2. 向UBT聲明第三方庫的頭文件路徑。
3. 向UBT聲明第三方庫的lib文件的完整路徑(含文件名)。
4. 向UBT聲明運行時需要加載的第三方庫的dll文件的完整路徑(含文件名),如果我們使用的第三方庫只需要靜態(tài)鏈接lib,那麼,這一步就不需要執(zhí)行了。
5. 如果第三方庫運行時需要加載對應(yīng)的dll,也就是上面第4步指定的dll,那麼,則需要在與插件同名的主模塊的StartupModule函數(shù)中獲取dll的句柄。
具體步驟操作
導入第三方庫的文件
首先,在插件的Source目錄下,新建一個ThirdParty目錄,這裏面新建一個用於包裝第三方庫的類型為External的模塊。根據(jù)實際需要,也可以創(chuàng)建多個模塊來包裝不同的第三方庫。第三方庫通常沒有源碼,他們會提供頭文件、靜態(tài)庫(.lib、.a)或者動態(tài)庫(.dll、.dylib、.so),或者二者皆有。把第三方庫的目錄複製到與包裝模塊的Build.cs同級的位置,以freetype和opencv爲例,會得到以下的目錄結(jié)構(gòu):
聲明第三方庫的Include路徑
還是以freetype和opencv爲例,在包裝模塊的`Build.cs`文件,也就是`ThirdPartyWrapper.Build.cs`中添加以下內(nèi)容:
? ModuleDirectory是Build.cs所在的目錄。P.S. 需要依賴System.IO程序集。
聲明第三方庫的lib文件名及路徑
如果第三方庫提供了靜態(tài)庫,靜態(tài)庫的鏈接是在編譯期完成的,因此,這部分工作需要通過Build.cs完成。核心方法是PublicAdditionalLibraries,這個函數(shù)會向UBT聲明編譯時依賴的靜態(tài)鏈接庫的完整路徑。在包裝模塊的ThirdPartyWrapper.Build.cs文件的構(gòu)造函數(shù)尾部添加:
通常,爲了區(qū)分不同平臺,代碼會寫成下面這個樣子:
聲明運行時依賴的dll文件及其路徑
這一步操作的核心方法是RuntimeDependencies,添加運行時依賴的動態(tài)鏈接庫的完整路徑。這裏需要注意的是dll必須首先複製到插件的Binaries目錄下。通過RuntimeDependencies的聲明,UnrealEditor打包時才會將dll打包到相應(yīng)的目錄中。
還是在ThirdPartyWrapper.Build.cs文件的構(gòu)造函數(shù)的相同位置繼續(xù)添加:
同時,還可以通過PublicDelayLoadDLLs,指定哪些運行時依賴的DLL可以延遲加載。比如:
完成之後,我們會得到如下代碼:
運行時加載動態(tài)庫
在插件的默認模塊啓動時,加載dll,類似代碼:
接下來就可以通過這個句柄來使用dll中的函數(shù)了。
記得要在模塊的ShutdownModule函數(shù)中釋放這個句柄資源:
在加載代碼中使用了IPluginManager查找dll的路徑,這個接口屬於Projects模塊,因此,Build.cs中需要添加依賴關(guān)係:
參考
官方文檔:https://docs.unrealengine.com/5.1/zh-CN/integrating-third-party-libraries-into-unreal-engine/
社區(qū)經(jīng)驗:https://segmentfault.com/a/1190000008210614