UE4 C++ 使用第三方库(动态库) 详解

2023-09-15 15:13:21

1 代码共享的方式

在使用三方库之前,先介绍一下三方库的由来,以及为什么需要三方库。就从程序员共享代码成果开始讲述。

1)三种共享方式:

代码分发也就是代码共享的方式有三种:源码动态库静态库

  1. 源码头文件(.h)+源文件(.cpp)
  2. 动态库头文件(可选)+LIB文件导入库,可选)+DLL文件
  3. 静态库头文件(.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 配置三方库

  1. 进入***.Build.cs文件,获取到Source文件目录(可以手动输入,也可以通过代码自动获取,这里直接手动输入路径)
string sSourceDir = new string("O:/UE5_Projects/Practices/CPP_ThirdParty/Source");
  1. 配置三方库的头文件路径和导入库路径。(别忘记加入命名空间)
//---------------------------------------------------------------------------------------------------------------------
// 添加命名空间
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"),
     }
 );
  1. 将.dll动态库拷贝到Binaries\Win64目录下。(不拷贝的话,编译不会出错,运行会报错,因为dll是运行时加载到内存的)

在这里插入图片描述

  1. 新建一个函数并调用三方库中的函数,测试是否配置成功。(这里就不再详细说明如何新建函数了,属于基础知识)

首先要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"),
            }
        );

    }
}
更多推荐

IT隔离电源系统在医院低压配电箱中的应用

【摘要】参考国外及国际对医疗领域的相应标准,结合我国有关的规范%标准,对手术室等处的供配电系统作出了探讨;论述了IT配电系统在医院的应用范围;分析了IT系统接地故障的特点;提出了医院手术室IT电源系统的基本配置。【关键词】手术室配电系统;故障;绝缘监视;漏电198.2138.07290引言*近,本院就北部分院的两百多个

mybatis动态sql&choose&foreach&sql 及include & sql中的特殊字符&后台分页实现& 数据版本号处理并发问题

1.动态sql简述mybatis的动态sql语句是基于OGNL表达式的。可以方便的在sql语句中实现某些逻辑.总体说来mybatis动态SQL语句主要有以下几类:if语句(简单的条件判断)choose(when,otherwize),相当于java语言中的switch,与jstl中的choose很类似trim(对包含的

【Python】基础数据结构:列表——元组——字典——集合

文章目录一、简述二、Python中的列表详解2.1创建列表2.2访问列表元素2.3修改列表元素2.4列表切片2.5列表方法2.6列表推导式三、Python中的元组详解3.1创建元组3.2访问元组元素3.3元组是不可变的3.4元组切片3.5元组方法四、Python中的字典详解4.1创建字典4.2访问字典元素4.3修改字典

IT隔离电源系统在医院电气设计中的应用

【摘要】许多国际标准都对医疗领域,尤其是那些生命攸关的场所,如手术室、重症监护室、心脏监护室等的配电系统作了特殊的规定。现在国际上针对医疗领域中的手术室、ICU、CCU等重要场所通常采用局部“中性点不接地的供电系统”(IEC标准称之为“医疗IT系统”或“隔离电源系统”)供电。文章阐述了IT系统设置的必要性,国内外规范的

机器学习实战:Python基于GBM梯度提升机进行预测(十四)

这篇干货很硬,喜欢的小伙伴点个赞/收藏,持续更新!文章目录1.前言1.1GBM的介绍1.2GBM的应用2.scikit-learn实战演示2.1分类问题2.2回归问题3.GBM超参数3.1决策树数量(n_estimators)3.2样本数量(subsample)3.3特征数量(max_features)3.4学习率(l

lv5 嵌入式开发-3 守护进程

目录1守护进程的概念1.1相关概念1.2举例1.3函数介绍2守护进程的实现2.1简单创建2.2守护进程创建2.3实例掌握:守护进程特点、会话、控制终端、创建守护进程1守护进程的概念守护进程又叫精灵进程(DaemonProcess),它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的

zabbix(一)

为什么需要监控?保证业务7*24小时,稳定运行小厂要求满足:99.9%大厂要求满足99.99%提前做监控,只要有问题立马报警,报警需要时间有时候出的故障,故障处理需要时间高可用性99.99%这个很难linux系统oomOutofmemorylinux内核杀掉程序进程,释放内存网速快,网页秒开网速慢,网页超时1M/s10

通讯网关软件008——利用CommGate X2Mysql实现OPC数据转储Mysql

本文介绍利用CommGateX2MYSQL实现从OPCServer读取数据并转储至MYSQL数据库。CommGateX2MYSQL是宁波科安网信开发的网关软件,软件可以登录到网信智汇(http://wangxinzhihui.com)下载。【案例】如下图所示,实现从OPCServer读取数据并转储至MYSQL数据库。【

企业诊断屋:二手车交易平台 APP 如何用 AB 测试赋能业务

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群2023年汽车行业新车市场低靡,由新车降价引发的车辆价格波动很快传导到二手车市场,二手车的交易也受到了冲击,收车验车更加谨慎,诸多二手交易平台想要保障平台的交易率也变得竞争激烈。二手车交易平台需要吸引各方平台上交易,既要有卖家又要有买家

车辆OBD数据采集

OBD接口作为车载监控系统的通讯接口,除了读取故障码以供修车外,其首要功能就是可提供车辆的各种工况数据,如燃油压力、发动机空气流量和车速等。OBD接口可快速方便地监测公司车辆和竞争车辆的多个系统和部件,包括发动机、催化转化器、颗粒捕集器、氧传感器、4a4949排放控制系统、燃油系统和GER等,从而可直接获取多项车辆基本

搭建本地人工智能框架LocalAI

什么是LocalAILocalAI是一个用于本地推理的,与OpenAIAPI规范兼容的RESTAPI。它允许您在本地使用消费级硬件运行LLM(不仅如此),支持与ggml格式兼容的多个模型系列。不需要GPU。最吸引老苏的有两点,一个是不需要GPU,另一点上可以使用消费级硬件,所以准备搭一个试试,至于后续用来干什么,到时候

热文推荐