【实战指南】使用第三方库(动态库):掌握UE5虚幻引擎的C++开发技巧!

请添加图片描述

  • 🙋‍♂️ 作者:海码007
  • 📜 专栏:UE虚幻引擎专栏
  • 💥 标题:【实战指南】使用第三方库(动态库):掌握UE5虚幻引擎的C++开发技巧!
  • ❣️ 寄语:人生的意义或许可以发挥自己全部的潜力,所以加油吧!
  • 🎈 最后:文章作者技术和水平有限,如果文中出现错误,希望大家能指正

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

    }
}
  • 13
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值