在开发中经常要用到第三方库,下面将使用第三方库的方法总结一下。
一、动态库的添加
UnrealEngine的wiki中提供了一种方案:
Linking Dlls:https://wiki.unrealengine.com/Linking_Dlls
dll中的代码:
https://github.com/XenoEgger/CreateAndLinkDLLTutSol/blob/master/CreateAndLinkDLLTut/CreateAndLinkDLLFile.h
https://github.com/XenoEgger/CreateAndLinkDLLTutSol/blob/master/CreateAndLinkDLLTut/CreateAndLinkDLLFile.cpp
调用dll的代码:
https://github.com/XenoEgger/CreateAndLinkDLLProj/blob/master/Source/CreateAndLinkDLLProj/Public/CreateAndLinkDLLTutBFL.h
https://github.com/XenoEgger/CreateAndLinkDLLProj/blob/master/Source/CreateAndLinkDLLProj/Private/CreateAndLinkDLLTutBFL.cpp
上述方案主要是使用如下两个函数,先获取dll文件句柄,再通过dll句柄获取方法指针,最后通过获取的方法指针调用dll中的方法:
FPlatformProcess::GetDllHandle(dllFilePath);
FPlatformProcess::GetDllExport(dllHandle, procName);
如果只需要调用dll的方法的话,采用上述方案是没有问题的,但如果调用dll中的类的话,上述方案就不合适了。下面就来说说如何调用dll中的类:
比如,将crypto++7和log4cplus-2.0.2编译成dll后生成如下文件:
crypto++7.lib
crypto++7.dll
log4cplus-2.0.2.lib
log4cplus-2.0.2.dll
crypto++7.lib和log4cplus-2.0.2.lib分别为crypto++7和log4cplus-2.0.2的导出库。
将它们放入工程目录下/Plugins/ThirdParty/Debug中,在*.Build.cs文件中添加如下代码:
Definitions.AddRange(new string[] {"CRYPTOPP_IMPORTS", "LOG4CPLUS_BUILD_DLL" });
// 第三方库debug目录
string ThirdPartyPath = Path.Combine(PluginsPath, "ThirdParty/Debug");
PublicLibraryPaths.Add(ThirdPartyPath);
// 添加.lib文件
PublicAdditionalLibraries.Add("crypto++7.lib");
PublicAdditionalLibraries.Add("log4cplus-2.0.2.lib");
PublicIncludePaths.AddRange(new string[] {
Path.Combine(PluginsPath, "cryptopp-CRYPTOPP_7_0_0/include"),
Path.Combine(PluginsPath, "log4cplus-2.0.2/include"),
});
其中,CRYPTOPP_IMPORTS和LOG4CPLUS_BUILD_DLL分别为crypto++7和log4cplus-2.0.2的导入参数;PublicAdditionalLibraries中分别添加了crypto++7和log4cplus-2.0.2的导出库.lib文件;PublicIncludePaths分别添加了crypto++7和log4cplus-2.0.2的头文件路径。
同时crypto++7.dll和log4cplus-2.0.2.dll必须放到Binaries/Win64目录下。
二、静态库的添加
方式跟动态库类似,比如,将asio-1.11.0和msgpack-c-cpp-3.1.1编译成静态库后生成如下文件:
asio-1.11.0.lib
msgpack-c-cpp-3.1.1.lib
asio-1.11.0.lib和msgpack-c-cpp-3.1.1.lib都是静态库,不是导出库。
将它们放入工程目录下/Plugins/ThirdParty/Debug中,在*.Build.cs文件中添加如下代码:
Definitions.AddRange(new string[] { "ASIO_STANDALONE", "MSGPACK_USE_CPP03" });
// 第三方库debug目录
string ThirdPartyPath = Path.Combine(PluginsPath, "ThirdParty/Debug");
PublicLibraryPaths.Add(ThirdPartyPath);
// 添加.lib文件
PublicAdditionalLibraries.Add("asio-1.11.0.lib");
PublicAdditionalLibraries.Add("msgpack-c-cpp-3.1.1.lib");
PublicIncludePaths.AddRange(new string[] {
Path.Combine(PluginsPath, "asio-1.11.0/include"),
Path.Combine(PluginsPath, "msgpack-c-cpp-3.1.1/include"),
});
其中,ASIO_STANDALONE和MSGPACK_USE_CPP03分别为asio-1.11.0和msgpack-c-cpp-3.1.1在编译时要用到的参数;PublicAdditionalLibraries中分别添加了asio-1.11.0和msgpack-c-cpp-3.1.1的静态库.lib文件;PublicIncludePaths分别添加了asio-1.11.0和msgpack-c-cpp-3.1.1的头文件路径。
参考文档:
Linking Dlls
Linking Static Libraries Using The Build System
How to Link External C Libraries .dll .lib With Your Project & Package With Game, Fast And Easy