一,内容概述
如果想用第三方库,不得不提一下UE4的编译系统,UnrealBuildTool。
UE4项目都是以模块为单位,不同模块构成整个系统。
UnrealBuildTool会将不同模块编译到一起,每一个module都需要一个.build.cs文件,当然这个文件还做其他很多工作,比如跨平台等。
使用第三方库的两种方法:
1,直接在工程项目的build.cs文件中配置这个第三方库。
2,根据UE4的模块定义,新构建一个模块,每一个模块都要有一个build.cs,通过build.cs对第三方库配置路径及库名,在项目中的buil.cs导入这个module。
(备注,本文只介绍静态库,与动态库有区别的,静态库在编译、期就要连接到工程dll中,所以要修改build.cs。
而第三方的动态库是在运行时再加载使用,所以一般不去更改build.cs,但要在cpp文件去显示调用。)
本文先介绍第一种方法,第二种后续再补上。
二,静态库的引用:创建与使用流程
1,在VS中,点击新建项目——Visual C++——Win32项目(比如名称为DllTest,实现一个加法,add)。
点击确定后,在导航窗口中选择静态库。
添加自己的类代码,修改为x64平台并生成DllTest.lib文件。(Debug与Release都可以)
(一般的非虚幻项目中,引用外部库只需要设置,项目->属性->配置属性->VC++目录,添加包含目录,库目录,ok.
代码中载入库文件 #pragma comment(lib," DllTest.lib ");就可以了,然而像前面提到的,虚幻有自己的编译系统,这么使用可以运行,但是无法打包)
2,新建一个UE4项目工程A.uproject,在期工程目录下建立一个层级文件夹,分别命名为ThirdParty-MyCalculation-inluce/lib,如下图
2,打开项目build.cs文件进行编辑,在\SNVRClayShooting\Source\SNVRClayShooting\目录下。
1 // Fill out your copyright notice in the Description page of Project Settings.
2
3 using System.IO;
4 using UnrealBuildTool;
5
6 public class SNVRClayShooting : ModuleRules
7 {
8 public SNVRClayShooting(ReadOnlyTargetRules Target) : base(Target)
9 {
10 PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
11
12 PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "HeadMountedDisplay", "ApexDestruction" });
13
14 PrivateDependencyModuleNames.AddRange(new string[] { "SteamVR" });
15
16 PrivateDependencyModuleNames.AddRange(new string[] { "NewModule" });
17
18 //AddEngineThirdPartyPrivateStaticDependencies(Target, "MySQLSupport");
19
20 // Uncomment if you are using Slate UI
21 // PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
22
23 // Uncomment if you are using online features
24 // PrivateDependencyModuleNames.Add("OnlineSubsystem");
25
26 // To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true
27
28 // //string ModulePath = Path.GetDirectoryName(r.GetModuleFileName(this.GetType().Name).CanonicalName);
29 // string ModulePath = ModuleDirectory;
30 // // gets the directory path of this module
31 // string ThirdPartyPath = Path.GetFullPath(Path.Combine(ModulePath, "../../ThirdParty/"));
32 // // gets the ThirdParty folder directory path
33 // string MySQLConnectorPath = ThirdPartyPath + "MySQLConnector.C6.1/";
34 // // gets the MySQL Connector.C 6.1 folder path
35 // string MySQLConnectorLibraryPath = MySQLConnectorPath + "lib/";
36 // // gets the path of the lib folder
37 // string MySQLConnectorIncludePath = MySQLConnectorPath + "include/";
38 // // gets the path of the include folder
39 // string MySQLConnectorImportLibraryName = Path.Combine(MySQLConnectorLibraryPath, "libmysql.lib");
40 // // gets the file path and name of the libmysql.lib static import library
41 // string MySQLConnectorDLLName = Path.Combine(MySQLConnectorLibraryPath, "libmysql.dll");
42 // // gets the file path and name of libmysql.dll
43 // if (!File.Exists(MySQLConnectorImportLibraryName))
44 // // check to ensure the static import lib can be located, or else we'll be in trouble
45 // {
46 // throw new BuildException(string.Format("{0} could not be found.", MySQLConnectorImportLibraryName));
47 // // log an error message explaining what went wrong if not found
48 // }
49 // if (!File.Exists(MySQLConnectorDLLName))
50 // // check to make sure the dll can be located or else we'll be in trouble
51 // {
52 // throw new BuildException(string.Format("{0} could not be found.", MySQLConnectorDLLName));
53 // // log an error message explaining what went wrong if not found
54 // }
55 // PrivateIncludePaths.Add(MySQLConnectorIncludePath);
56 // // add the "include" folder to our dependencies. I've chosen PrivateIncludePaths since I hide the mysql headers from external code
57 // PublicLibraryPaths.Add(MySQLConnectorLibraryPath);
58 // // add the "lib" folder to our dependencies
59 // PublicAdditionalLibraries.Add(MySQLConnectorImportLibraryName);
60 // // add libmysql.lib static import library as a dependency
61 // PublicDelayLoadDLLs.Add(MySQLConnectorDLLName);
62 // // add libmysql.dll as a dll
63
64 string ModulePath = ModuleDirectory;
65 // gets the directory path of this module
66 string ThirdPartyPath = Path.GetFullPath(Path.Combine(ModulePath, "../../ThirdParty/"));
67 // gets the ThirdParty folder directory path
68 string MySQLConnectorPath = ThirdPartyPath + "MyCalculation/";
69 // gets the MySQL Connector.C 6.1 folder path
70 string MySQLConnectorLibraryPath = MySQLConnectorPath + "lib/Win64/";
71 // gets the path of the lib folder
72 string MySQLConnectorIncludePath = MySQLConnectorPath + "include/";
73 // gets the path of the include folder
74 string MySQLConnectorImportLibraryName = Path.Combine(MySQLConnectorLibraryPath, "DllTest.lib");
75 // gets the file path and name of the libmysql.lib static import library
76
77 if (!File.Exists(MySQLConnectorImportLibraryName))
78 // check to ensure the static import lib can be located, or else we'll be in trouble
79 {
80 throw new BuildException(string.Format("{0} could not be found.", MySQLConnectorImportLibraryName));
81 // log an error message explaining what went wrong if not found
82 }
83
84 PrivateIncludePaths.Add(MySQLConnectorIncludePath);
85 // add the "include" folder to our dependencies. I've chosen PrivateIncludePaths since I hide the mysql headers from external code
86 PublicLibraryPaths.Add(MySQLConnectorLibraryPath);
87 // add the "lib" folder to our dependencies
88 PublicAdditionalLibraries.Add(MySQLConnectorImportLibraryName);
89 // add libmysql.lib static import library as a dependency
90 }
91 }
build.cs中就是把第三方静态库路径及名称配置好,跟VS的差别就是VS是配置在VS工具的属性里,UE4需要配置在编译系统的UnrealBuildTool里。
3,在项目代码中#include 第三方库所需要的头文件就可以正常使用。
以上亲测通过,包括打包也没有问题。
来源:oschina
链接:https://my.oschina.net/u/4361425/blog/3300150