当前位置: 首页 > news >正文

UE5 不同的编译模式下,module的组织形式

由于最近在琢磨UE5.4这个引擎,在学习过程中,碰到了一些非常有意思的事情,我在尝试把之前写的一些底层库搬到UE里面,比如底层库,网络库等等,我通过建立module,将这些库用源代码的方式整合进了UE5,因为我一直认为整体编译可以更方便的更改编译条件,因此都是用源代码的方式,比如一个atom的库,编译的C#脚本如下:

// Copyright Epic Games, Inc. All Rights Reserved.using System.IO;
using UnrealBuildTool;public class atom : ModuleRules
{public atom(ReadOnlyTargetRules Target) : base(Target){PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;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 ...});}
}

非常的简单,甚至屏蔽了所有依赖。 然后在入口的module引用这个库。其编译脚本如下:

// Copyright Epic Games, Inc. All Rights Reserved.using System.IO;
using UnrealBuildTool;public class Portal : ModuleRules
{public Portal(ReadOnlyTargetRules Target) : base(Target){PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;PublicIncludePaths.AddRange(new string[] {// ... add public include paths required here ..."atom/code",});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 ..."atom"});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 ...});}
}

然后在public dependcy里面将该库引入。这样,就可以编译了。

但是问题来了,这个方法只适合客户端模式,不适合编辑器模式!因为客户端可以用静态库,而编辑器模式需要的是动态库。编辑器模式下甚至打不开编辑器。告诉我atom的dll不存在。

这个非常的坑,我想了很多办法都没有办法兼容两种模式。

后来,迫不得已,我只能将这个atom库改成静态库,不参与编译。其新的编译脚本如下:

// Copyright Epic Games, Inc. All Rights Reserved.using System.IO;
using UnrealBuildTool;public class atom : ModuleRules
{public atom(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", "x64", "atom_Debug.lib"));}
}

主要是将module的类型改成External,不参与编译,同时准备好这个库的静态库。

然后入口module的编译脚本如下:

// Copyright Epic Games, Inc. All Rights Reserved.using System.IO;
using UnrealBuildTool;public class Portal : ModuleRules
{public Portal(ReadOnlyTargetRules Target) : base(Target){PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;PublicIncludePaths.AddRange(new string[] {// ... add public include paths required here ..."atom/code",});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 ..."atom",});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 ...});}
}

这个地方引入了静态库,再编译,就可以再客户端模式和编辑器模式下一同生效。

http://www.lryc.cn/news/473737.html

相关文章:

  • 【ms-swift 大模型微调实战】
  • Linux:网络基础
  • mysql 的内连接、左连接、右连接有什么区别?
  • update-alternatives(选择工具)
  • php解密,sg11解密-sg15解密 如何由sourceGuardian11-sourceGuardian15加密(sg11加密~sg15加密)的源码
  • b站小土堆PyTorch视频学习笔记(二)
  • Linux的压缩及其解压命令
  • GXYCTF2019:gakki
  • 顺序表(C 语言)
  • 一:时序数据库-Influx应用
  • Word文档丢失抢救方法:15 个 Word 文档恢复工具
  • 关于自动驾驶等级相关知识
  • Java中跳转结构
  • CNN-Attention分类预测 | Matlab实现多特征分类预测
  • [java][基础]JSP
  • 《测绘学报》
  • 代码随想录之链表刷题总结
  • Python爬虫的“京东大冒险”:揭秘商品类目信息
  • 双目视觉标定——1原理与实践
  • 【设计模式系列】代理模式(八)
  • 微服务架构设计的初次尝试——基于以太坊智能合约 + NestJS 微服务的游戏社区与任务市场系统:架构设计
  • “北斗+实景三维”,助力全域社会治理
  • #渗透测试#SRC漏洞挖掘# 信息收集-常见端口及谷歌语法
  • 如何使用java雪花算法在分布式环境中生成唯一ID?
  • 【php常用公共函数】php获取指定时间段相差几小时,几分钟,几秒
  • 图文深入介绍Oracle DB link(一)
  • Uniswap/v2-core使用及其交易流程
  • clickhouse运维篇(二):多机器手动部署ck集群
  • OpenCV视觉分析之目标跟踪(7)目标跟踪器类TrackerVit的使用
  • Java 实现 RESTful 风格的 Web 服务详解