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

目录

  • 1 代码共享的方式
  • 2 使用三方库
    • 2.1 准备一个动态库(包含.h;.lib;.dll)
    • 2.2 创建一个UE C++工程
    • 2.3 配置三方库

1 代码共享的方式

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

1)三种共享方式:

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

  1. 源码头文件(.h)+源文件(.cpp)
  2. 动态库头文件(可选)+LIB文件导入库,可选)+DLL文件
  3. 静态库头文件(.h)+LIB文件非导入库
    UE4 C++ 使用第三方库(动态库) 详解_第1张图片

2)头文件、LIB文件、DLL文件作用时段

预备知识:C或C++程序从源文件到生成可执行文件exe需经历四个阶段:分别是预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)、链接(Linking)。

阶段 任务
预处理 将所有**#define删除,并展开所有的宏定义**;处理所有的条件预编译指令;处理**#include**预编译指令,将被包含的文件直接插入到预编译指令的位置;删除所有注释;添加行号和文件标识,一遍编译时产生调试用的行号及编译错误警告行号;保留所有的#pragma编译器指令;等等;
编译 编译是将预处理生成的文件,经过词法分析、语法分析、语义分析以及优化后编译成若干个目标模块。可以理解为将高级语言翻译为计算机可以理解的二进制代码,即机器语言
汇编 有些地方说汇编是把编译后的产出翻译成机器语言。
链接 链接阶段所要完成的工作,是将同一项目中各源文件生成的目标文件(.obj)和程序中用到的库文件整合为一个可执行文件。虽然库文件明确用于链接,但编译器提供了2种实现链接的方式,分别称为静态链接动态链接。采用静态链接方式实现链接操作的库文件称为静态链接库(简称静态库);采用动态链接方式实现链接操作的库文件称为动态链接库(简称动态库)。

作用时段:头文件在编译时使用。LIB文件在链接时使用;DLL文件在运行时使用;
UE4 C++ 使用第三方库(动态库) 详解_第2张图片

2 使用三方库

2.1 准备一个动态库(包含.h;.lib;.dll)

如果不知道怎么编译或者创建动态库的去查看其他文章;

本文准备了一个gdal的动态库,学习GIS的同学应该不陌生,这是一个负责处理栅格和矢量数据的三方库。
内容包括bin、include、lib(分别存放了.dll动态库、.h头文件、.lib动态库导入库文件)
UE4 C++ 使用第三方库(动态库) 详解_第3张图片

2.2 创建一个UE C++工程

本文创建了CPP_ThirdParty工程,并在Source文件夹下,新建一个ThirdParty目录,将gdal动态库复制进去。
UE4 C++ 使用第三方库(动态库) 详解_第4张图片

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是运行时加载到内存的)

UE4 C++ 使用第三方库(动态库) 详解_第5张图片

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

    }
}

你可能感兴趣的:(UE,c++,ue4,游戏)