摘要:
写这个文章主要是被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)相关推荐

  1. UE4引用第三方库Lib以及dll

    ####前段时间在研究UE4引入外部的函数库,但是由于网上的相关文章并不多,大都东拼西凑,或者故意写的很花哨,不利于新手学习,或者直接无脑的转载,比如各种感谢A先生--,很多文章我都照着做了但都未成功 ...

  2. Python3源码编译和使用静态链接库lib动态链接库dll详细介绍

    说明: 本文主要介绍: 1.python3源码的下载和编译内核工程(pythoncore) 2.编译的lib和dll使用例子. 若需要编译源码PCBuild下其他python工程,类似参考内核工程(p ...

  3. VulkanLearning - 环境搭建:使用CLion+cmake链接第三方库

    不知从何时开始,突然不想再打开VS写东西了(这人pass有病(很大一部分原因是找不到如何添加VC工程模板(说白了就是一条菜狗)))加上正要开始学习Vulkan以及一些相关的图形学知识,在工程编译方面要 ...

  4. UE4之整合第三方库

    UE4的第三方库,大家都建议使用插件进行整合,那么我也尝试一下插件整合. 首先先写一个C++的动态库: 在AddSdk.h的头文件里面,定义一个函数: __declspec(dllimport) in ...

  5. bazel 链接第三方动态库_Linux 动态库与静态库制作及使用详解

    Linux 应用开发通常要考虑三个问题,即:1)在 Linux 应用程序开发过程中遇到过标准库链接在不同 Linux 版本下不兼容的问题: 2)在 Linux 静态库的制作过程中发现有别于 Windo ...

  6. UE4中使用第三方库Ⅱ

    昨日不可追, 今日尤可为.勤奋,炽诚,不忘初心 相关文章连接 : C++编译动态库第三方库及使用:点此连接 或点这里:https://blog.csdn.net/lunweiwangxi3/artic ...

  7. C++编译动态库第三方库及使用

    昨日不可追, 今日尤可为.勤奋,炽诚,不忘初心 C++编译动态库第三方库及使用 为什么很多人,尤其各大厂商只给我们库文件让我们调用,而不直接提供源代码呢?这样的好处是1.把代码封装成各个模块以便复用. ...

  8. 动态链接库(.dll) 动态导入库(.lib) 静态链接库(.lib)

    这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一本书<程序员的自 ...

  9. 静态链接库(Lib)和动态链接库(DLL)

    序言:本文主要讲解静态链接库和动态链接库的区别,以及怎么样编译和引用两种库,怎么样从DLL中导出函数和导出C++类. 一.静态链接库和动态链接库 1.静态链接库(.LIB):函数和数据被编译进一个二进 ...

最新文章

  1. BeautifulSoup学习笔记
  2. C#中关于处理两个大数相乘的问题
  3. mingw msys 编译 libzip
  4. python输入名字、输出欢迎你_python笔记3-输出输入、字符串格式化
  5. JavaScript String
  6. SAP与Ariba在数据分析领域的互补共赢
  7. 【Linux环境】SSH突然无法连接【排查2个小时最终解决Failed to start OpenSSH server daemon】及【阿里云服务器的 kdevtmpfsi 挖矿病毒处理】
  8. boost::mpl模块实现equal相关的测试程序
  9. Win10 + Python + MXNet + VS2015配置
  10. eclipse 界面设置与字体更改
  11. python填充数组到指定长度
  12. 爱情九十一课,留下好的你
  13. lombok 的使用
  14. 分布式缓存技术redis学习系列(一)——redis简介以及linux上的安装
  15. [Java基础]StringUtils.join()方法与String.join()方法的使用
  16. 2022-2028全球食品和饮料行业热转印设备行业调研及趋势分析报告
  17. python微控制器编程从零开始 pdf_Python微控制器编程从零开始
  18. 轻松搞懂均匀分布、高斯分布、瑞利分布、莱斯分布(含MATLAB代码)
  19. JavaScript 身份证验证
  20. Cisco ASA 的telnet设置

热门文章

  1. Android之四大组件概念讲解
  2. Java中finally和return执行顺序
  3. RxSwift ViewModel定义
  4. Hystrix的一个坑,queue中的run方法没有被执行?
  5. 测试用例实例--常见功能测试点(转)
  6. Python之路【第八篇】python实现线程池
  7. 【转载】应读者强烈要求给出《超容易的Linux系统管理入门书》一书的主要知识点...
  8. visio二次开发___事件篇___事件分类
  9. Ace-editor 输入内容时光标闪动,定位错乱的解决方案
  10. bootstrapDialog插件集成datatables插件遇到的异常