UE4--用外掛載入第三方庫lib/dll(lsl)

要什麼鬼暱稱發表於2020-12-06

背景:

     用UE4進行外掛開發,需要引用到第三方庫LSL。

解決歷程:

      對於一個UE4純新手以及C++6年沒碰的我的來說,簡直就是在虐待我的頭髮,哎。遇到的第一個問題是怎麼在我的外掛裡面引用到這個第三方庫,網上查了很多資料,大多不是很理解,最終還是看了這篇文章才終於把專案在VS中跑通,在這裡十分感謝作者。(https://blog.csdn.net/qq_36409711/article/details/82112867

      但是,VS跑通了UE4的專案卻跑不起來了,報錯是說我的外掛無法載入成功,可能是系統錯誤或者外掛配置錯誤。然後我又薅了一個多小時的頭髮低效的在網上翻了一圈還是沒有任何思路,搞得我都有點自暴自棄了。沒有任何思路的我只能碰運氣,於是我又去新建了一個第三方庫外掛去看它的程式碼以及引用方式,發現在ThirdParty中的XXX.build.cs檔案裡比我在上面那篇文章看的多了兩行程式碼。

 

// Delay-load the DLL, so we can load it from the right place first
			PublicDelayLoadDLLs.Add("ExampleLibrary.dll");

			// Ensure that the DLL is staged along with the executable
			RuntimeDependencies.Add("$(PluginDir)/Binaries/ThirdParty/t1Library/Win64/ExampleLibrary.dll");

         我抱著試一試的心態在自己的外掛.Build.cs中也把這兩行加上,但我還是不放心又仿照它dll和lib的存放路徑將lsl.dll與lsl.lib放到一個資料夾下,再到外掛的/Binaries/Win64中放了一個lsl.dll,最後把PublicDelayLoadDLLs.Add("ExampleLibrary.dll");這句程式碼中dll的地址參考之前載入lsl.lib地址的方式改了一下,然後嘗試編譯。VS正常通過了沒有問題,開啟專案,發現神奇的不報錯了這讓我很開心,以為我終於成功了(雖然不知道哪一行程式碼起了效果,也沒弄明白原理,但是先這樣吧)。

 PublicIncludePaths.Add(Path.Combine(ThirdPartyPath, "include"));
 PublicAdditionalLibraries.Add(Path.Combine(ThirdPartyPath, "lib", "lsl.lib"));
 PublicDelayLoadDLLs.Add(Path.Combine(ThirdPartyPath, "lib", "lsl.dll"));
 RuntimeDependencies.Add("$(PluginDir)/Binaries/Win64/lsl.dll");

 

          然而,事情並沒有結束,我呼叫自己寫的測試方法時直接導致UE4崩潰,我人都傻了!一分析錯誤日誌是 0x00007ffd85b2a388 KERNELBASE.dll!UnknownFunction []  也就是說,程式專案都通過了,但還是找不對對應的方法,啊!!!!我可憐的頭髮!到這裡已經沒什麼資料可以翻的了(自以為),UE4引用LSL本就沒有什麼文章可以看,就連C++的都沒找到一篇(可能是沒去外網找,或者找錯了地方,而且UE4還是魔改C++),到這我也沒轍了,我就盲猜!

          我想到我下載下來的liblsl壓縮包中include資料夾裡除了lsl_c.h的標頭檔案之外還有一個lsl的資料夾,裡面的標頭檔案中有包括我測試方法裡要呼叫的那個方法lsl_create_streaminfo,我就在想是不是因為這些標頭檔案不在同一級目錄下導致方法找不到,抱著試一試的態度我lsl資料夾裡的標頭檔案全部複製了出來,放到了lsl_c.h的同級目錄下,然後再試。結果測試方法終於跑通啦!我的頭髮終於不用再受到虐待了!

 

最終結果:

          完全就是一臉懵逼的成功引用了第三方庫lsl,以及掉了一地的頭髮!當然我這種搞法只是成功呼叫,後續打包應該還會出現問題而且寫法也應該不是最簡潔的,堪堪能用而已,但我還是決定記錄下來併發出去,也許也能幫到和我同樣的新手。

相關文章