UE4 使用第三方lib,dll,.so,.a

以下是在4.22.3版本中使用结果,版本不同可能会有所差异。

 

首先对于所有第三方库都应该先加入对头文件目录的包含:

在模块的Build.cs文件中,加入对应的第三方库的头文件包含路径,这样就可以在包含头文件时,找到对应的文件;

 

PublicIncludePaths.Add(path);//包含目录中的头文件并公开到外部模块

PrivateIncludePaths.Add(Path);//包含目录中的头文件并不公开到外部模块,外部模块访问不到头文件

例如:

PublicIncludePaths.Add("$(ModuleDir)/include")

对于插件中的模块:

PublicIncludePathsPrivateIncludePaths可以接受特殊字符串开头的字符串:

可接受以下特殊字符串有

$(ModuleDir) 表示模块目录(D:\UE4_Project\testSlate\Plugins\MotionMocap\Source\MotionMocap)

$(PluginDir) 表示插件目录D:\UE4_Project\testSlate\Plugins\MotionMocap

$(EngineDir) 表示引擎目录D:\Program Files (x86)\UE4\UE_4.22\Engine

$(ProjectDir) 表示工程目录D:\UE4_Project\testSlate

不可接受的

$(TargetOutputDir)

$(BinaryOutputDir)

 

通常用法如下:PublicIncludePaths.Add("$(ModuleDir)/include")

如果path是相对路径,则是从D:\Program Files (x86)\UE4\UE_4.22\Engine\Source,开始的相对路径

对于非插件中的模块:

PublicIncludePathsPrivateIncludePaths不接受特殊字符串

如果path是相对路径,则是从工程目录的Source开始D:\UE4_Project\testSlate\Source\,开始的相对路径

 

接下来是库文件的使用:

使用第三方lib和.a文件(也就是当使用静态库时)

首先要包含库的搜索路径(不是必须,为了方便查找库文件)

PublicLibraryPaths.Add(path)

例如:PublicLibraryPaths.Add("$(ModuleDir)/lib")

path对于插件和非插件模块的规则与上面PublicIncludePaths.Add(path)一致

然后包含要使用的库:

PublicAdditionalLibraries.Add(path)

例如:PublicAdditionalLibraries.Add("freetype26MT.lib")

path对于插件和非插件模块的规则与上面PublicIncludePaths.Add(path)一致,需要带文件后缀名

用法通常如下:

PublicAdditionalLibraries.Add("freetype26MT.lib");

PublicAdditionalLibraries.Add(FreeType2LibPath + "Mac/libfreetype2412.a");

PublicAdditionalLibraries.Add("arcore_sdk_c");//对于.a和.so, 没有路径时可以省略文件lib开通和后缀名,比如这里的库文件名可能是libarcore_sdk_c.so 或者libarcore_sdk_c.a

使用第三方dll

隐式连接方式:

首先要包含第三方lib文件的搜索路径(不是必须,为了方便查找库文件)跟上面使用第三方lib文件一致

PublicLibraryPaths.Add(path)

PublicAdditionalLibraries.Add(path)

例如:

PublicLibraryPaths.Add("$(ModuleDir)/lib")

PublicAdditionalLibraries.Add("freetype26MT.lib")

 

然后需要将第三方dll文件放置到指定目录中:

在插件中使用第三方库时

放置在插件目录的生成目录中,比如:

在插件MotionMocap中时,放置在如下目录中:

D:\UE4_Project\testSlate\Plugins\MotionMocap\Binaries\Win64

在游戏项目中使用第三方库时:

放置在项目的生成目录中,比如:

D:\UE4_Project\testSlate\Binaries\Win64

这时,运行编辑器是没有问题的,但如果打包的话,会出现dll文件没有被打进包里的情况。

所以需要使用以下设置:

 

RuntimeDependencies.Add(path,[SourcePath])

例如:RuntimeDependencies.Add("$(BinaryOutputDir)/libzmq-v141-mt-4_3_3.dll")

该设置会在打包项目时,将对应的目录下的文件拷贝到打包项目对应目录下。

对于隐式连接第三方dll来说,path都应该以$(BinaryOutputDir)开头,然后跟上dll文件名称和后缀。$(BinaryOutputDir)代表了插件或者游戏生成二进制文件的目录,也就是上面提到的D:\UE4_Project\testSlate\Plugins\MotionMocap\Binaries\Win64或者D:\UE4_Project\testSlate\Binaries\Win64,

 

当我们使用带有SourcePath版本的RuntimeDependencies.Add时, 我们可以不用手动放置第三方dll文件到上面提到D:\UE4_Project\testSlate\Plugins\MotionMocap\Binaries\Win64或者D:\UE4_Project\testSlate\Binaries\Win64中,当我们编译工程时,工程自动会复制SourcePath所指定的文件到path所指定的目录。

例如:RuntimeDependencies.Add("$(BinaryOutputDir)/libzmq-v141-mt-4_3_3.dll", Path.Combine(ModuleDirectory, "ZeroMQ", "lib")+"\\" +"libzmq-v141-mt-4_3_3.dll");

 

当然RuntimeDependencies 并不仅限于dll,也可以用于其他文件的操作,但path路径必须是以工程路径开始的,比如工程路径为D:\UE4_Project\testSlate\,则path必须是D:\UE4_Project\testSlate\包含的目录下的文件

path和sourcepath可接受以下特殊字符串

$(ModuleDir) 表示模块目录(D:\UE4_Project\testSlate\Plugins\MotionMocap\Source\MotionMocap)

$(PluginDir) 表示插件目录,仅在插件模块中有效,游戏模块会报错D:\UE4_Project\testSlate\Plugins\MotionMocap

$(EngineDir) 表示引擎目录D:\Program Files (x86)\UE4\UE_4.22\Engine

$(ProjectDir) 表示工程目录D:\UE4_Project\testSlate

$(TargetOutputDir)表示Directory containing the output executable,也就是exe文件输出目录,这个好像只在打包时有效。

$(BinaryOutputDir)表示Directory containing the binary that links this module.也就是dll文件目录

 

显式连接方式:

因为不需要lib文件,所有我们只需要设置

RuntimeDependencies.Add(path,[SourcePath])

这里path并不需要设置为$(BinaryOutputDir)开头的形式,只需设置为以工程路径开始即可,具体使用方法可以看这里:

https://wiki.unrealengine.com/Linking_Dlls

 

使用第三方.SO文件

首先要包含第三方.so文件的搜索路径(不是必须,为了方便查找库文件)

PublicLibraryPaths.Add(path)

 

例如:PublicLibraryPaths.Add("$(ModuleDir)/lib/android/arm7/")

然后包含要使用的库:

 

PublicAdditionalLibraries.Add(path)

例如:PublicAdditionalLibraries.Add("libcef.so")

 

然后对于Android和linux有不同的策略:

Android:

string BuildPath = Utils.MakePathRelativeTo(ModuleDirectory, BuildConfiguration.RelativeEnginePath);

AdditionalPropertiesForReceipt.Add(new ReceiptProperty("AndroidPlugin", Path.Combine(BuildPath, "My_APL_armv7.xml")));

 

My_APL_armv7.xml文件放到与build.cs同目录下

内容如下:

<?xml version="1.0" encoding="utf-8"?>

<!-- steps to add to build additions -->

<root xmlns:android="http://schemas.android.com/apk/res/android">

<!-- init section is always evaluated once per architecture -->

<init>

<setBool result="bSupported" value="false"/>

<isArch arch="armeabi-v7a">

<setBool result="bSupported" value="true"/>

</isArch>

</init>

 

<!-- optional files or directories to copy to Intermediate/Android/APK -->

<resourceCopies>

<isArch arch="armeabi-v7a">

<copyFile src="$S(PluginDir)/armv7/libcrypto.so"

dst="$S(BuildDir)/libs/armeabi-v7a/libcrypto.so" />

</isArch>

</resourceCopies>

 

<!-- optional libraries to load in GameActivity.java before libUE4.so -->

<soLoadLibrary>

<if condition="bSupported">

<true>

<loadLibrary name="myso" failmsg="Failed to load myso library" />

</true>

</if>

</soLoadLibrary>

</root>

更具体的请看这里:

https://wiki.unrealengine.com/index.php?title=How_to_add_a_shared_library_(.so)_in_android_project

Linux:

需要设置.so文件使用依赖,以便打包时复制到打包项目对应目录

RuntimeDependencies.Add(path,[SourcePath])

例如:RuntimeDependencies.Add("$(ProjectDir)/lib/libopenvr_api.so");

这里path并不需要设置为$(BinaryOutputDir)开头的形式,只需设置为以工程路径开始即可。

然后设置运行时库的搜索路径:

PrivateRuntimeLibraryPaths.Add(path);

 

这里的路径path应该是上面RuntimeDependencies.Add(path)path的目录:例如:PrivateRuntimeLibraryPaths.Add("$(ProjectDir)/lib/");

 

 

 

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值