目录
- 1 代码共享的方式
- 2 使用三方库
- 2.1 准备一个动态库(包含.h;.lib;.dll)
- 2.2 创建一个UE C++工程
- 2.3 配置三方库
1 代码共享的方式
在使用三方库之前,先介绍一下三方库的由来,以及为什么需要三方库。就从程序员共享代码成果开始讲述。
1)三种共享方式:
代码分发也就是代码共享的方式有三种:源码、动态库、静态库。
- 源码:头文件(.h)+源文件(.cpp)
- 动态库:头文件(可选)+LIB文件(导入库,可选)+DLL文件
- 静态库:头文件(.h)+LIB文件(非导入库)
2)头文件、LIB文件、DLL文件作用时段
预备知识:C或C++程序从源文件到生成可执行文件exe需经历四个阶段:分别是预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)、链接(Linking)。
阶段 | 任务 |
---|---|
预处理 | 将所有**#define删除,并展开所有的宏定义**;处理所有的条件预编译指令;处理**#include**预编译指令,将被包含的文件直接插入到预编译指令的位置;删除所有注释;添加行号和文件标识,一遍编译时产生调试用的行号及编译错误警告行号;保留所有的#pragma编译器指令;等等; |
编译 | 编译是将预处理生成的文件,经过词法分析、语法分析、语义分析以及优化后编译成若干个目标模块。可以理解为将高级语言翻译为计算机可以理解的二进制代码,即机器语言。 |
汇编 | 有些地方说汇编是把编译后的产出翻译成机器语言。 |
链接 | 链接阶段所要完成的工作,是将同一项目中各源文件生成的目标文件(.obj)和程序中用到的库文件整合为一个可执行文件。虽然库文件明确用于链接,但编译器提供了2种实现链接的方式,分别称为静态链接和动态链接。采用静态链接方式实现链接操作的库文件称为静态链接库(简称静态库);采用动态链接方式实现链接操作的库文件称为动态链接库(简称动态库)。 |
作用时段:头文件在编译时使用。LIB文件在链接时使用;DLL文件在运行时使用;
2 使用三方库
2.1 准备一个动态库(包含.h;.lib;.dll)
如果不知道怎么编译或者创建动态库的去查看其他文章;
本文准备了一个gdal的动态库,学习GIS的同学应该不陌生,这是一个负责处理栅格和矢量数据的三方库。
内容包括bin、include、lib(分别存放了.dll动态库、.h头文件、.lib动态库导入库文件)
2.2 创建一个UE C++工程
本文创建了CPP_ThirdParty工程,并在Source文件夹下,新建一个ThirdParty目录,将gdal动态库复制进去。
2.3 配置三方库
- 进入***.Build.cs文件,获取到Source文件目录(可以手动输入,也可以通过代码自动获取,这里直接手动输入路径)
string sSourceDir = new string("O:/UE5_Projects/Practices/CPP_ThirdParty/Source");
- 配置三方库的头文件路径和导入库路径。(别忘记加入命名空间)
//---------------------------------------------------------------------------------------------------------------------
// 添加命名空间
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
//---------------------------------------------------------------------------------------------------------------------
// 1.配置头文件路径PublicIncludePaths.AddRange(new string[] {Path.Combine(ModuleDirectory, sSourceDir+"/ThirdParty/gdal-3.5.1/include"),});// 2.配置导入库.lib路径PublicAdditionalLibraries.AddRange(new string[] {Path.Combine(sSourceDir+"/ThirdParty/gdal-3.5.1/lib/vc16_x64", "gdal.lib"),});
- 将.dll动态库拷贝到Binaries\Win64目录下。(不拷贝的话,编译不会出错,运行会报错,因为dll是运行时加载到内存的)
- 新建一个函数并调用三方库中的函数,测试是否配置成功。(这里就不再详细说明如何新建函数了,属于基础知识)
首先要include头文件,其次就是调用三方库中的函数
#include "./ThirdParty/gdal-3.5.1/include/gdal.h"
//---------------------------------------------------------------------------------------------------------------------
// 说明:使用gdal库函数
// 日期:2023-9-15
//---------------------------------------------------------------------------------------------------------------------
void ATestThirdPartyActor::UseGdal()
{int a = GDALDataType::GDT_Byte;UE_LOG(LogTemp, Warning, TEXT("GDALDataType::GDT_Byte = %d"), a);return;
}
调用结果输出如下:调用成功!!!
如果显示错误 C4668 没有将“GNUC”定义为预处理器宏,用“0”替换“#if/#elif”错误。
则添加下面一行代码即可。
bEnableUndefinedIdentifierWarnings = false;
总结:***Build.cs文件所以代码如下:
using UnrealBuildTool;//---------------------------------------------------------------------------------------------------------------------
// 添加命名空间
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
//---------------------------------------------------------------------------------------------------------------------public class CPP_ThirdParty : ModuleRules
{public CPP_ThirdParty(ReadOnlyTargetRules Target) : base(Target){//添加下面一行解决//错误 C4668 没有将“__GNUC__”定义为预处理器宏,用“0”替换“#if/#elif” UeCesiumEx_TaiWan O:\Other\3D\UE5_Projects\Cesium\UeCesiumEx_TaiWan\Source\UeCesiumEx_TaiWan\PlotSync\cereal\details\traits.hpp 34bEnableUndefinedIdentifierWarnings = false;PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });PrivateDependencyModuleNames.AddRange(new string[] { });//-------------------------------------------------------------------------------------------------------------//作者:何浩文//日期:2023-9-15//说明:配置第三方库//-------------------------------------------------------------------------------------------------------------string sSourceDir = new string("O:/UE5_Projects/Practices/CPP_ThirdParty/Source");// 1.配置头文件路径PublicIncludePaths.AddRange(new string[] {Path.Combine(ModuleDirectory, sSourceDir+"/ThirdParty/gdal-3.5.1/include"),});// 2.配置导入库.lib路径PublicAdditionalLibraries.AddRange(new string[] {Path.Combine(sSourceDir+"/ThirdParty/gdal-3.5.1/lib/vc16_x64", "gdal.lib"),});}
}