欢迎光临散文网 会员登陆 & 注册

在UE中引用第三方庫

2023-09-09 15:11 作者:Nilzen  | 我要投稿

創建包含第三方庫的插件

官方推薦的方法是通过第三方库插件插件模板进行集成。

通過插件模板創建之後,我們會得到一個包含二個Module的Plugin目錄,其中一個是與Plugin同名的主模塊;另一個則是用來引用第三方庫的包裝模塊。這個包裝模塊和普通模塊一樣,具有最基本的三個文件ModuleName.cpp,ModuleName.h以及ModuleName.Build.cs。這種做法比較乾净地對第三方庫進行了隔離。模板創建的示例模塊中清晰地標明了,這種模塊的類型需要被設置為ModuleType.External,如果在插件的主模塊中直接引用第三方庫,使用這種類型標識,會出現一個編譯錯誤:`XXX is not a C++ module (referenced via default plugins → XXX.uplugin)`。

在插件中引用第三方庫需要完成以下事務

1. 將第三方庫的頭文件和庫文件導入到Plugin中的子目錄下 。

2. 向UBT聲明第三方庫的頭文件路徑。

3. 向UBT聲明第三方庫的lib文件的完整路徑(含文件名)。

4. 向UBT聲明運行時需要加载的第三方庫的dll文件的完整路径(含文件名),如果我们使用的第三方庫只需要靜態鏈接lib,那麽,這一步就不需要執行了。

5. 如果第三方庫運行時需要加載對應的dll,也就是上面第4步指定的dll,那麽,則需要在與插件同名的主模塊的StartupModule函數中獲取dll的句柄。

具體步驟操作

導入第三方庫的文件

首先,在插件的Source目錄下,新建一個ThirdParty目錄,這裏面新建一個用於包裝第三方庫的類型為External的模塊。根據實際需要,也可以創建多個模塊來包裝不同的第三方庫。第三方庫通常沒有源碼,他們會提供頭文件、靜態庫(.lib、.a)或者動態庫(.dll、.dylib、.so),或者二者皆有。把第三方庫的目錄複製到與包裝模塊的Build.cs同級的位置,以freetype和opencv爲例,會得到以下的目錄結構:


聲明第三方庫的Include路徑

還是以freetype和opencv爲例,在包裝模塊的`Build.cs`文件,也就是`ThirdPartyWrapper.Build.cs`中添加以下内容:

⬆ ModuleDirectory是Build.cs所在的目錄。P.S. 需要依賴System.IO程序集。

聲明第三方庫的lib文件名及路徑

如果第三方库提供了静态库,静态库的链接是在编译期完成的,因此,这部分工作需要通过Build.cs完成。核心方法是PublicAdditionalLibraries,这个函数会向UBT声明編譯時依賴的靜態鏈接庫的完整路徑。在包装模块的ThirdPartyWrapper.Build.cs文件的构造函数尾部添加:

通常,爲了區分不同平臺,代碼會寫成下面這個樣子:

聲明運行時依賴的dll文件及其路徑

這一步操作的核心方法是RuntimeDependencies,添加運行時依賴的動態鏈接庫的完整路徑。這裏需要注意的是dll必須首先複製到插件的Binaries目錄下。通過RuntimeDependencies的聲明,UnrealEditor打包時才會將dll打包到相應的目錄中。

還是在ThirdPartyWrapper.Build.cs文件的構造函數的相同位置繼續添加:

同時,还可以通過PublicDelayLoadDLLs,指定哪些運行時依賴的DLL可以延遲加載。比如:

完成之後,我们會得到如下代碼:

運行時加載動態庫

在插件的默認模塊啓動時,加載dll,類似代碼:

接下來就可以通過這個句柄來使用dll中的函數了。

記得要在模塊的ShutdownModule函數中釋放這個句柄資源:

在加載代碼中使用了IPluginManager查找dll的路徑,這個接口屬於Projects模塊,因此,Build.cs中需要添加依賴關係:

參考

官方文檔:https://docs.unrealengine.com/5.1/zh-CN/integrating-third-party-libraries-into-unreal-engine/

社區經驗:https://segmentfault.com/a/1190000008210614

在UE中引用第三方庫的评论 (共 条)

分享到微博请遵守国家法律