以下是在4.22.3版本中使用结果,版本不同可能会有所差异。
首先对于所有第三方库都应该先加入对头文件目录的包含:
在模块的Build.cs文件中,加入对应的第三方库的头文件包含路径,这样就可以在包含头文件时,找到对应的文件;
PublicIncludePaths.Add(path);//包含目录中的头文件并公开到外部模块
或
PrivateIncludePaths.Add(Path);//包含目录中的头文件并不公开到外部模块,外部模块访问不到头文件
例如:
PublicIncludePaths.Add("$(ModuleDir)/include")
对于插件中的模块:
PublicIncludePaths和PrivateIncludePaths可以接受特殊字符串开头的字符串:
可接受以下特殊字符串有:
$(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,开始的相对路径
对于非插件中的模块:
PublicIncludePaths和PrivateIncludePaths不接受特殊字符串
如果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/");