在使用三方库之前,先介绍一下三方库的由来,以及为什么需要三方库。就从程序员共享代码成果开始讲述。
1)三种共享方式:
代码分发也就是代码共享的方式有三种:源码、动态库、静态库。
2)头文件、LIB文件、DLL文件作用时段
预备知识:C或C++程序从源文件到生成可执行文件exe需经历四个阶段:分别是预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)、链接(Linking)。
阶段 | 任务 |
---|---|
预处理 | 将所有**#define删除,并展开所有的宏定义**;处理所有的条件预编译指令;处理**#include**预编译指令,将被包含的文件直接插入到预编译指令的位置;删除所有注释;添加行号和文件标识,一遍编译时产生调试用的行号及编译错误警告行号;保留所有的#pragma编译器指令;等等; |
编译 | 编译是将预处理生成的文件,经过词法分析、语法分析、语义分析以及优化后编译成若干个目标模块。可以理解为将高级语言翻译为计算机可以理解的二进制代码,即机器语言。 |
汇编 | 有些地方说汇编是把编译后的产出翻译成机器语言。 |
链接 | 链接阶段所要完成的工作,是将同一项目中各源文件生成的目标文件(.obj)和程序中用到的库文件整合为一个可执行文件。虽然库文件明确用于链接,但编译器提供了2种实现链接的方式,分别称为静态链接和动态链接。采用静态链接方式实现链接操作的库文件称为静态链接库(简称静态库);采用动态链接方式实现链接操作的库文件称为动态链接库(简称动态库)。 |
如果不知道怎么编译或者创建动态库的去查看其他文章;
本文准备了一个gdal的动态库,学习GIS的同学应该不陌生,这是一个负责处理栅格和矢量数据的三方库。
内容包括bin、include、lib(分别存放了.dll动态库、.h头文件、.lib动态库导入库文件)
本文创建了CPP_ThirdParty工程,并在Source文件夹下,新建一个ThirdParty目录,将gdal动态库复制进去。
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"),
}
);
首先要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 34
bEnableUndefinedIdentifierWarnings = 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"),
}
);
}
}