一.基本内容概述
最近做项目时经常看到build.cs文件,就想研究一下UE4中第三方库的使用。通过网络以及wiki确实获取到不少有用的信息,但是没有一篇文章,让我看完就立刻明白的。所以,我在这里详细的描述dll与lib在UE4中的使用,同时简单描述一些基本原理,解决网上的一些文章由于描述不清而造成的误导。
UE4本身有很多功能使用的是第三方的库,如物理physX,模型优化Simplygon,SpeedTree以及steam平台相关内容等等。我们如果想使用一些自己的已经实现的库(或者其他现成的库)我们通常可以把库文件放到下面这个的地方——\Engine\Source\ThirdParty目录(下面的例子就是放到这个目录的)。
(这里需要注意一下,库文件的位置其实是随意的,你只要让引擎能找到他就行。比如你随意的放了一个位置,那你可以通过下面几个方法获取一些特定的路径,然后进一步寻找你的库文件。UEBuildConfiguration.UEThirdPartySourceDirectory方法可以获取到当前所在第三方库的目录,ModuleDirectory表示当前模块的目录,*FPaths::GamePluginsDir()可以获取到当前项目的插件目录。总之,多查查,多试试,各种API,没有你找不到的文件)
如果想要使用自己的库,就不得不提到UE4的编译系统,UnrealBuildTool。UE4里面的项目都是以Module模块为单位的,不同模块之间关联在一起,构成整个系统。UnrealBuildTool负责将不同的模块编译到一起,每一个Module模块需要一个.build.cs文件。比如联机需要的OnlineSubSystemSteam就是一个插件模块,你同时还可以看到OnlineSubsystemFacebook等模块。(当然,UnrealBuildTool做的工作可能比你想的还多,比如跨平台相关的处理等。)
那么我想添加第三方库就出现了两种选择:
第一,自己在工程项目下新建一个目录,直接在项目工程的.build.cs下配置这个第三方库,比较直接了当。缺点是,多个静态库,就需要写多行代码,可能需要经常修改。
第二,通常我们添加一个库之后,应该给这个库建立一个Module(当然也就需要建立一个对应的库模块的.build.cs文件),方便管理与修改。项目直接调用这个Module即可。可以随时通过修改项目工程的.build.cs安装与卸载整个模块。缺点是还要单独建立一个第三方库的Module,不如方法一简单。
下面的例子中,我使用的是方法二。一般来说,第三方库模块的.build.cs文件与项目工程的.build.cs文件差异还是很大的。
(静态库与动态库是有区别的。静态库是在编译期就要链接到工程的dll里面的,所以需要去修改项目的build文件来配置。而第三方的动态库是在运行时而不是在编译的时候使用,所以一般不需要配置build文件,但需要在cpp里面获取。)
二.第三方库与插件的关系
对于不熟悉UE4的人,可能对第三方库与插件的关系有点模糊。对于第三方库,一般我们在F:\UnrealEngine4.14\Engine\Source\ThirdParty目录下存放其源代码,头文件,lib等。而第三方库的dll一般存在于F:\UnrealEngine4.14\Engine\Binaries\ThirdParty目录下。正如字面上的理解,第三方库更偏向于于一个代码工具库,直接服务于我们的代码。
而插件,是直接服务于功能的。插件分为引擎插件与项目插件,分别位于F:\UnrealEngine4.14\Engine\Plugins与F:\UE4Project\项目名称\Plugins,插件的源码就位于这两个文件夹,而其二进制文件通过引擎生成后同样位于该目录的Binary文件夹下。插件可以在不直接修改引擎代码的前提下,为引擎添加完整独立的新功能,或者修改引擎中内建的功能。每一个插件至少包含一个Module,你可以根据你插件里面的内容对模块进行进一步的划分(参考下图Media插件的布局分布,一个AndroidMedia还有好几个Module)。我们的插件模块与项目一样,也可能需要包含第三方库,需要在插件源码的build文件里面配置。
关于插件的使用,网上有很多教程,这里贴出来几篇给大家作为参考,如果有什么问题,欢迎大家在文章末尾提问。
http://blog.csdn.net/sh15285118586/article/details/53332951
http://blog.csdn.net/yangxuan0261/article/details/52098104
三.静态库:创建与使用流程
1.新建一个静态库lib(如果有库文件就跳过这步)
在VS中,点击新建项目——VisualC++——Win32项目(比如名称为MyThirdParty)。
点击确定后,在导航窗口中选择静态库。
添加自己的类代码,修改为x64平台并生成MyThirdParty.lib文件。(Debug与Release都可以)
(一般的非虚幻项目中,引用外部库只需要设置,项目->属性->配置属性->VC++目录,添加包含目录,库目录,ok,代码中载入库文件 #pragmacomment(lib," MyThirdParty.lib ");就可以了,然而像前面提到的,虚幻有自己的编译系统,这么使用可以运行,但是无法打包)
2.在\Engine\Source\ThirdParty目录下新建自己的库模块
在\Engine\Source\ThirdParty目录下,新建文件夹并命名,这里以MyTestThirdParty为例。把用到的头文件以及lib分别放到文件夹include,文件夹lib下。
给第三方库模块创建一个新的MyTestThirdParty.build.cs文件。
3.编辑MyTestThirdParty.build.cs文件
MyTestThirdParty.build.cs文件内容如下:
public classMyTestThirdParty : ModuleRules
{
publicMyTestThirdParty(TargetInfoTarget)
{
//表示第三方库
Type= ModuleType.External;
//第三方库新模块根目录目录路径你可以通过其他方式来获取路径比如get { return Path.GetFullPath(Path.Combine(ModuleDirectory,"../../ThirdParty/"));}
stringMyPath= UEBuildConfiguration.UEThirdPartySourceDirectory +"MyTestThirdParty/";
//包含的头文件路径,因为编译的库里面都是链接过的编译单元,可以认为编译单元是不包含头文件的,所以在之后的使用时还需要获取到头文件的声明信息