UE4链接第三方库(lib和dll)
摘要:
写这个文章主要是被UE官方的wiki和answerhub误导了很久,这本来是一个很常见和基本的问题,但是无论是官方的wiki或者是论坛上的提问都十分散乱并且充斥各种错误,因此记录下这个在开发中时常遇到的问题。
在开发中经常遇到的问题就是加入某第三方库的支持,这样的第三方库往往属于无源码,而且可能是静态lib或者是动态dll甚至两者皆有。UE4的编译管理用的是自己的UBT(unreal binary tool)因此链接第三方库的工作主要是编写UBT脚本。
1.以插件方式集成.
基本上这个是最推荐的集成第三方库的方式,因为能够很好的隔离你的代码和第三方代码的影响,在UE4的源码里也可以看到很多第三方库都是这么集成的,比如paper2D,leapmotion等等。在UE4中新建插件的方式略去不表,当你新建完你的插件之后,你会在插件的代码目录下看到一个
xxx.build.cs
接下来要做的就是修改这个脚本:
得到当前路径
private string ModulePath
{get { return ModuleDirectory; }
}
关于第三方库放的位置,一般是在plugin的源码同级文件夹下建一个ThirdParty文件夹,里面放上include lib等等。
得到ThirdParty文件夹的路径
private string ThirdPartyPath
{get { return Path.GetFullPath(Path.Combine(ModulePath,"../../ThirdParty/")); }
}
为工程添加include第三方库的头文件路径
在模快的构造函数里加上:
PublicIncludePaths.AddRange(new string[] { Path.Combine(ThirdPartyPath, "xxx", "Include"),});PrivateIncludePaths.AddRange(new string[] {Path.Combine(ThirdPartyPath, "Foxit", "Include"),});
链接第三方库的Lib
接下来需要在编译工程时加入第三方静态库的链接,静态链接属于工程在编译期间做的事情,因此这块需要通过cs脚本完成,而dll动态链接库的加载是运行期的事,因此需要在cpp文件中执行。
我们新建一个叫LoadxxxLib的函数,并把它放在模块的构造函数结尾执行:
public bool LoadxxxLib(TargetInfo Target){bool isLibararySupported = false;if ((Target.Platform == UnrealTargetPlatform.Win64) || (Target.Platform == UnrealTargetPlatform.Win32)){isLibararySupported = true;string PlatformString = (Target.Platform == UnrealTargetPlatform.Win64) ? "Win64" : "Win32";PublicAdditionalLibraries.Add(Path.Combine(LibraryPath, PlatformString + ".lib"));PublicDelayLoadDLLs.Add(PlatformString + ".dll");RuntimeDependencies.Add(new RuntimeDependency(LibraryPath + PlatformString + ".dll"));}return isLibararySupported;}
这样就可以保证在编译期链接上我们的第三方lib。
链接动态DLL
这个工作需要在plugin的运行期完成,在插件的source文件下找到一个与插件名字同名的cpp文件打开。会看到一个StartupModule的函数,我们需要在这里得到dll文件的handle。
在StartupModule中添加下面的代码:
void FXXXModule::StartupModule()
{
#if PLATFORM_64BITSFString platform = TEXT("win64.dll");
#elseFString platform = TEXT("win32.dll");
#endifFString path = IPluginManager::Get().FindPlugin("XXX")->GetBaseDir(); FString dllpath = path + "/ThirdParty/XXX/Lib/" + platform;PdfDllHandle = FPlatformProcess::GetDllHandle(*dllpath);if (!PdfDllHandle){UE_LOG(LogTemp, Warning, TEXT("Failed to load PDF library."));}
}
这里我们用的是PluginManager找到的插件所在的路径,值得注意的是使用这个函数时需要在build.cs
中加入
PrivateDependencyModuleNames.AddRange(new string[]{..."Projects",});
否则工程会链接出错。
UE4链接第三方库(lib和dll)相关推荐
- UE4引用第三方库Lib以及dll
####前段时间在研究UE4引入外部的函数库,但是由于网上的相关文章并不多,大都东拼西凑,或者故意写的很花哨,不利于新手学习,或者直接无脑的转载,比如各种感谢A先生--,很多文章我都照着做了但都未成功 ...
- Python3源码编译和使用静态链接库lib动态链接库dll详细介绍
说明: 本文主要介绍: 1.python3源码的下载和编译内核工程(pythoncore) 2.编译的lib和dll使用例子. 若需要编译源码PCBuild下其他python工程,类似参考内核工程(p ...
- VulkanLearning - 环境搭建:使用CLion+cmake链接第三方库
不知从何时开始,突然不想再打开VS写东西了(这人pass有病(很大一部分原因是找不到如何添加VC工程模板(说白了就是一条菜狗)))加上正要开始学习Vulkan以及一些相关的图形学知识,在工程编译方面要 ...
- UE4之整合第三方库
UE4的第三方库,大家都建议使用插件进行整合,那么我也尝试一下插件整合. 首先先写一个C++的动态库: 在AddSdk.h的头文件里面,定义一个函数: __declspec(dllimport) in ...
- bazel 链接第三方动态库_Linux 动态库与静态库制作及使用详解
Linux 应用开发通常要考虑三个问题,即:1)在 Linux 应用程序开发过程中遇到过标准库链接在不同 Linux 版本下不兼容的问题: 2)在 Linux 静态库的制作过程中发现有别于 Windo ...
- UE4中使用第三方库Ⅱ
昨日不可追, 今日尤可为.勤奋,炽诚,不忘初心 相关文章连接 : C++编译动态库第三方库及使用:点此连接 或点这里:https://blog.csdn.net/lunweiwangxi3/artic ...
- C++编译动态库第三方库及使用
昨日不可追, 今日尤可为.勤奋,炽诚,不忘初心 C++编译动态库第三方库及使用 为什么很多人,尤其各大厂商只给我们库文件让我们调用,而不直接提供源代码呢?这样的好处是1.把代码封装成各个模块以便复用. ...
- 动态链接库(.dll) 动态导入库(.lib) 静态链接库(.lib)
这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一本书<程序员的自 ...
- 静态链接库(Lib)和动态链接库(DLL)
序言:本文主要讲解静态链接库和动态链接库的区别,以及怎么样编译和引用两种库,怎么样从DLL中导出函数和导出C++类. 一.静态链接库和动态链接库 1.静态链接库(.LIB):函数和数据被编译进一个二进 ...
最新文章
- BeautifulSoup学习笔记
- C#中关于处理两个大数相乘的问题
- mingw msys 编译 libzip
- python输入名字、输出欢迎你_python笔记3-输出输入、字符串格式化
- JavaScript String
- SAP与Ariba在数据分析领域的互补共赢
- 【Linux环境】SSH突然无法连接【排查2个小时最终解决Failed to start OpenSSH server daemon】及【阿里云服务器的 kdevtmpfsi 挖矿病毒处理】
- boost::mpl模块实现equal相关的测试程序
- Win10 + Python + MXNet + VS2015配置
- eclipse 界面设置与字体更改
- python填充数组到指定长度
- 爱情九十一课,留下好的你
- lombok 的使用
- 分布式缓存技术redis学习系列(一)——redis简介以及linux上的安装
- [Java基础]StringUtils.join()方法与String.join()方法的使用
- 2022-2028全球食品和饮料行业热转印设备行业调研及趋势分析报告
- python微控制器编程从零开始 pdf_Python微控制器编程从零开始
- 轻松搞懂均匀分布、高斯分布、瑞利分布、莱斯分布(含MATLAB代码)
- JavaScript 身份证验证
- Cisco ASA 的telnet设置
热门文章
- Android之四大组件概念讲解
- Java中finally和return执行顺序
- RxSwift ViewModel定义
- Hystrix的一个坑,queue中的run方法没有被执行?
- 测试用例实例--常见功能测试点(转)
- Python之路【第八篇】python实现线程池
- 【转载】应读者强烈要求给出《超容易的Linux系统管理入门书》一书的主要知识点...
- visio二次开发___事件篇___事件分类
- Ace-editor 输入内容时光标闪动,定位错乱的解决方案
- bootstrapDialog插件集成datatables插件遇到的异常