如何将 cryptopp库移植到UE5内

ops/2024/10/20 21:07:17/

cryptopp是一个开源免费的算法库,这个库的用途非常多,我常常用这个库来做加解密的运算。这段时间在折腾UE5.4.4,学习的过程中,准备把cryptopp移植到游戏的工程内,但UE的编译环境和VS的编译环境完全不同,能在VS下顺利编译的cryptopp代码,移植之后,全在报错,错误千奇百怪,我尝试了修复这些错误,结果有一些错是根本修复不了的。我列举一些典型的错误如下:

12>D:\UEProject\Dawn\Source\cryptopp\code\algebra.cpp(1): error : Expected algebra.h to be first header included.
12>D:\UEProject\Dawn\Source\cryptopp\code\algparam.cpp(1): error : Expected algparam.h to be first header included.
12>D:\UEProject\Dawn\Source\cryptopp\code\allocate.cpp(1): error : Expected allocate.h to be first header included.
12>D:\UEProject\Dawn\Source\cryptopp\code\arc4.cpp(1): error : Expected arc4.h to be first header included.
12>D:\UEProject\Dawn\Source\cryptopp\code\aria.cpp(1): error : Expected aria.h to be first header included.
12>D:\UEProject\Dawn\Source\cryptopp\code\asn.cpp(1): error : Expected asn.h to be first header included.
12>D:\UEProject\Dawn\Source\cryptopp\code\authenc.cpp(1): error : Expected authenc.h to be first header included.
12>D:\UEProject\Dawn\Source\cryptopp\code\base32.cpp(1): error : Expected base32.h to be first header included.
12>D:\UEProject\Dawn\Source\cryptopp\code\base64.cpp(1): error : Expected base64.h to be first header included.
12>D:\UEProject\Dawn\Source\cryptopp\code\basecode.cpp(1): error : Expected basecode.h to be first header included.
12>D:\UEProject\Dawn\Source\cryptopp\code\blake2.cpp(1): error : Expected blake2.h to be first header included.
12>D:\UEProject\Dawn\Source\cryptopp\code\blowfish.cpp(1): error : Expected blowfish.h to be first header included.


1>D:\UEProject\Dawn\Intermediate\Build\Win64\x64\UnrealGame\DebugGame\cryptopp\Definitions.cryptopp.h(19): note: 参见“CRYPTOPP_API”的前一个定义
1>D:\UEProject\Dawn\Source\cryptopp\code\config_misc.h(121): error C4668: 没有将“CRYPTOPP_GCC_VERSION”定义为预处理器宏,用“0”替换“#if/#elif”
1>D:\UEProject\Dawn\Source\cryptopp\code\config_misc.h(121): error C4668: 没有将“CRYPTOPP_LLVM_CLANG_VERSION”定义为预处理器宏,用“0”替换“#if/#elif”
1>D:\UEProject\Dawn\Source\cryptopp\code\config_misc.h(122): error C4668: 没有将“CRYPTOPP_APPLE_CLANG_VERSION”定义为预处理器宏,用“0”替换“#if/#elif”
1>D:\UEProject\Dawn\Source\cryptopp\code\config_misc.h(194): error C4668: 没有将“CRYPTOPP_GCC_DIAGNOSTIC_AVAILABLE”定义为预处理器宏,用“0”替换“#if/#elif”
1>D:\UEProject\Dawn\Source\cryptopp\code\misc.h(644): error C4668: 没有将“CRYPTOPP_GCC_VERSION”定义为预处理器宏,用“0”替换“#if/#elif”
1>D:\UEProject\Dawn\Source\cryptopp\code\misc.h(644): error C4668: 没有将“CRYPTOPP_LLVM_CLANG_VERSION”定义为预处理器宏,用“0”替换“#if/#elif”
1>D:\UEProject\Dawn\Source\cryptopp\code\misc.h(645): error C4668: 没有将“CRYPTOPP_APPLE_CLANG_VERSION”定义为预处理器宏,用“0”替换“#if/#elif”

这些错有些是UBT的配置问题,有些是作者对C++宏定义本身写法不够严谨引起的,还有一些离谱的错误,应该和编译环境有关。

这些错误完全无法解决,所以我想了一个办法,就是在外部用VS2022直接编译cryptopp工程,然后生成cryptopp的库文件,通过UE Moudle的方式,将库引入UE5.4.4。

具体方法如下:

第一步,编译cryptopp,打开cryptopp目录中cryptest.sln这个工程文件,然后打开项目cryptlib这个工程的属性,将C/C++下的代码生成中,运行库一栏选择为MD方式(多线程DLL)。然后编译整个库。得到cryptopp.lib文件。

第二步,把crypto作为一个moudle引入到UE项目内。在UE工程的source目录下,创建cryptopp目录。并且在cryptopp内继续创建inc和lib目录。将相应的文件拷贝到对应目录。

第三步,在cryptopp目录下创建cryptopp.Build.cs文件。内容如下:

using System.IO;
using UnrealBuildTool;public class cryptopp : ModuleRules
{public cryptopp(ReadOnlyTargetRules Target) : base(Target){//PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;Type = ModuleType.External;PublicIncludePaths.AddRange(new string[] {// ... add public include paths required here ...});PrivateIncludePaths.AddRange(new string[] {// ... add other private include paths required here ...});PublicDependencyModuleNames.AddRange(new string[]{// "Core",// ... add other public dependencies that you statically link with here ...});PrivateDependencyModuleNames.AddRange(new string[]{//"CoreUObject",//"Engine",// "Slate",// "SlateCore",// ... add private dependencies that you statically link with here ...	});DynamicallyLoadedModuleNames.AddRange(new string[]{// ... add any modules that your module loads dynamically here ...});// 添加导入库或静态库PublicAdditionalLibraries.Add(Path.Combine(ModuleDirectory, "lib", "cryptlib_Release.lib" ));}
}

主要是把Type改成ModuleType.External, 告诉UBT这个模块是第三方库,不需要编译,然后再设置好需要导入的库文件和路径。

最后一步,在UE主模块的编译脚本内,添加要引入的模块,不加入的话会报链接找不到符号的错误。

		PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "EnhancedInput", "cryptopp" });

加入之后,重新刷新vs工程,然后再编译工程,就可以使用cryptopp了。


http://www.ppmy.cn/ops/124648.html

相关文章

第十五章 RabbitMQ延迟消息之延迟插件

目录 一、引言 二、延迟插件安装 2.1. 下载插件 2.2. 安装插件 2.3. 确认插件是否生效 三、核心代码 四、运行效果 五、总结 一、引言 上一章我们讲到通过死信队列组合消息过期时间来实现延迟消息,但相对而言这并不是比较好的方式。它的代码实现相对来说比…

Unity用VS打开FGUI脚本变成杂项怎么处理?

在Unity中使用Visual Studio(VS)打开FGUI脚本时,如果脚本显示为杂项文件,这通常意味着VS没有正确识别或关联这些脚本文件。以下是一些解决此问题的步骤: 对惹,这里有一个游戏开发交流小组,大家…

ubuntu服务器使用netplan管理工具添加静态地址

系统版本:ubuntu 7.5.0-3ubuntu1~18.04 linux version 4.15.0-112.generic 1、查看network配置文件 cd到netplan目录下,首先看下IP地址是做在那个配置文件中 cd /etc/netplan2、使用nano编辑器进行添加静态IP地址 (注意:1.必须…

uniapp学习(003-3 vue3学习 Part.3)

零基础入门uniapp Vue3组合式API版本到咸虾米壁纸项目实战,开发打包微信小程序、抖音小程序、H5、安卓APP客户端等 总时长 23:40:00 共116P 此文章包含第21p-第p25的内容 文章目录 双向绑定的实现原理例子 计算属性例子1双向绑定格式改成计算属性 例子2 watchwatc…

工业和自动化领域常见的通信协议

在工业和自动化领域,有多种常见的通信协议,主要用于设备间的通信、数据传输和控制。 Modbus: 类型:串行通信协议用途:广泛用于工业自动化设备间的通信,如PLC、传感器和执行器。优点:简单、开放且…

Java面向对象编程--高级

目录 一、static关键字 1.1 静态变量 1.2 静态内存解析 1.3 static的应用与练习 二、单例设计模式 2.1 单例模式 2.2 如何实现单例模式 三、代码块 3.1 详解 3.2 练习,测试 四、final关键字 五、抽象类与抽象方法 5.1 abstract 5.2 练习 六、接口 6.…

【JS】消除头尾的换行符、空格符

一、需求说明 删除 ckeditor 生成的文本的开头和结尾的额外换行符、空格符,但不删除文本本身之间的空格、换行内容。 举例: 1、原始数据 2、期望数据 二、需求分析 1. 从 ckeditor 获得的全部字符串解析content.getData()为 HTMLCollection。 2. 遍…

Linux运维_Apache更改默认网站目录

1.首先创建目录 并且在目录下新建测试文件 index.html mkdir -p /home/test/ap_web 直接wget 百度官网 wget www.baidu.com 2.编辑配置文件 /etc/apache2/sites-available/000-default.conf(找到 DocumentRoot)更改为刚刚创建的目录 接着在添加 最终文件: 3.给文件 添加属…