如何将 cryptopp库移植到UE5内

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文件。内容如下:

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主模块的编译脚本内,添加要引入的模块,不加入的话会报链接找不到符号的错误。

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

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

相关推荐
ricky6753 天前
[Linux]Linux系统的20个实用命令详解
ue5
AA陈超4 天前
虚幻引擎5 GAS开发俯视角RPG游戏 P05-01.创建游戏玩法标签
c++·游戏·ue5·游戏引擎·虚幻
reddingtons5 天前
场景美术师的“无限画板”:UE5中非破坏性的材质混合(Material Blending)工作流
ue5·材质·设计师·技术美术·游戏策划·游戏美术·substance
m0_552200825 天前
《UE5_C++多人TPS完整教程》学习笔记61 ——《P62 武器开火特效(Fire Weapon Effects)》
c++·游戏·ue5
努力的小钟5 天前
UE5 GAS GameAbility源码解析 EndAbility
ue5
AA陈超5 天前
虚幻引擎5 GAS开发俯视角RPG游戏 P05-04 使用效果应用游戏标签
c++·游戏·ue5·游戏引擎·虚幻
zhangzhangkeji5 天前
UE5 测量 -1,长度测量:P2制作定位球与定位线,P3制作射线检测节点,P4在鼠标位置生成定位球
ue5
AA陈超7 天前
虚幻引擎UE5专用服务器游戏开发-33 在上半身播放组合蒙太奇
c++·游戏·ue5·游戏引擎·虚幻
zhangzhangkeji7 天前
cesium126,230130,Editing Tileset Materials - 0,编辑瓦片集材质,官方教程:
ue5
zhangzhangkeji7 天前
cesium126,230131,区域局部染色:赋值材质实例,建立“材质图层混合”文件,建立裁剪多边形,并应用自己的材质实例
ue5