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 ...});}
}
这个地方引入了静态库,再编译,就可以再客户端模式和编辑器模式下一同生效。
相关文章:
UE5 不同的编译模式下,module的组织形式
由于最近在琢磨UE5.4这个引擎,在学习过程中,碰到了一些非常有意思的事情,我在尝试把之前写的一些底层库搬到UE里面,比如底层库,网络库等等,我通过建立module,将这些库用源代码的方式整合进了UE5…...
【ms-swift 大模型微调实战】
安装环境 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simplepip install modelscope vllm ‘ms-swift[llm]’ -U 下载模型 modelscope download --model Qwen/Qwen2.5-7B-Instruct --local_dir ./Qwen2.5-7B-Instruct 微调 实验环境:…...
Linux:网络基础
计算机是人的工具,人需要协作,于是有了网络 专用服务器->专用计算机 局域网:随着计算机的数量增加,通过交换机和路由器连接计算机 广域网:将远隔千里的计算机都连在一起 协议 协议就是约定俗成 计算机之间用光信号…...
mysql 的内连接、左连接、右连接有什么区别?
在MySQL中,内连接、左连接和右连接是三种常见的连接类型,它们用于通过共享一个或多个字段的值,将两个或多个表组合在一起进行查询。以下是这三种连接类型的详细区别: 一、内连接(INNER JOIN) 定义&#x…...
update-alternatives(选择工具)
0 Preface/foreword 1 update-alternatives介绍 1.1 选项和用法 1.2 install用法 update-alternatives --install <link> <name> <path> <priority> [--slave <link> <name> <path>] link:符号链接(软链…...
php解密,sg11解密-sg15解密 如何由sourceGuardian11-sourceGuardian15加密(sg11加密~sg15加密)的源码
sg11加密~sg11加密的PHP文件运行需安装SG11加密-SG15加密组件使用、支持WINDOW及LINUX各版本 sg11解密(SourceGuardian)-sg15解密(SourceGuardian),号称目前最安全的组件加密已可以解密,解密率99.9%,基本可以直接使用,代码特征是…...
b站小土堆PyTorch视频学习笔记(二)
Dataloader:提供不同类型的数据集;为后面的网络提供不同的数据形式 Dataset:提供一种方式去获取数据及其label(标签) 主要实现以下两个功能: {如何获取每一个数据及其lable;告诉我们总共有多少数据} fr…...
Linux的压缩及其解压命令
1、zip文件 压缩 zip linux.zip linux 解压 unzip linux.zip 2、gz文件 压缩 gzip 1.tar 解压 gzip -d 1.tar.gz 3、tar文件(tar可打/解包,压缩/解压文件) 打包 tar -cf 1.rar test 解包 tar -xf 1.tar 解压gz并解包 tar -xjvf archive_name.tar.bz2&#…...
GXYCTF2019:gakki
把题目给的附件解压后给了张图片,顺带着瞟一眼属性,没有值得注意的 binwalk检测一手,看见有个rar压缩包 提取出来的压缩包是有密码的,但是题目并没有给出获取密码的途径,所以先爆破试试,用最常用的四位数爆…...
顺序表(C 语言)
目录 一、线性表二、顺序表1. 静态顺序表2. 动态顺序表2.1 动态顺序表的实现分析2.2 动态顺序表的实现2.3 动态顺序表存在的问题 三、与数组有关的面试题1. 移除元素2. 删除有序数组中的重复项 一、线性表 线性表(linear list)是n个具有相同特性的数据元…...
一:时序数据库-Influx应用
目录 0、版本号 1、登录页面 2、账号基本信息 3、数据库案例 4、可视化 5、java案例 0、版本号 InfluxDB v2.4.0 1、登录页面 http://127.0.0.1:8086/signin 账号:自己账号 密码:自己密码 2、账号基本信息 查看用户id和组织id!&…...
Word文档丢失抢救方法:15 个 Word 文档恢复工具
MS Word 文档恢复的重要性 对于严重依赖 Microsoft Word 创建和编辑文档的个人和企业来说,MS Word 文档恢复是一个至关重要的方面。 文件损坏、系统崩溃和其他意外事件可能会导致 Word 文档中存储的重要数据丢失。 及时恢复这些文档有助于节省时间、精力和资源。 本…...
关于自动驾驶等级相关知识
本文主要介绍自动驾驶等级的一下知识,在介绍之前,首先要介绍一些基本知识,然后介绍自动驾驶不同等级 1、自动驾驶相关知识 监控和判断(OEDA):指对车辆周围的物体和事件进行检测和感知,并给出应…...
Java中跳转结构
在Java中,跳转结构用于控制程序的执行流程。 2.4.1 break 用途: 用于终止当前循环(for、while、do-while)或switch语句。 public class BreakExample {public static void main(String[] args) {for (int i 0; i < 10; i) {if (i 5) …...
CNN-Attention分类预测 | Matlab实现多特征分类预测
CNN-Attention分类预测 | Matlab实现多特征分类预测 目录 CNN-Attention分类预测 | Matlab实现多特征分类预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现CNN-Attention卷积神经网络融合注意力机制多特征分类预测,运行环境Matlab2023b及以上…...
[java][基础]JSP
目标: 理解 JSP 及 JSP 原理 能在 JSP中使用 EL表达式 和 JSTL标签 理解 MVC模式 和 三层架构 能完成品牌数据的增删改查功能 1,JSP 概述 JSP(全称:Java Server Pages):Java 服务端页面。是一种动态的…...
《测绘学报》
《测绘学报》 办刊宗旨:尊重科学、弘扬学术、追求卓越、求实创新。60多年来,《测绘学报》作为承载着测绘地理信息科学技术和科研成果的载体,作为测绘地理信息行业人才培养和学术交流的阵地,坚持把学术论文的质量放在期刊工作的重要…...
代码随想录之链表刷题总结
目录 1.链表理论基础 2.移除链表元素 3.设计链表 4.翻转链表 5.两两交换链表中的节点 6.删除链表中的第N个节点 7.链表相交 8.环形链表 1.链表理论基础 链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域…...
Python爬虫的“京东大冒险”:揭秘商品类目信息
开篇:欢迎来到Python的奇幻森林 在这个数据驱动的时代,我们就像一群探险家,穿梭在数字的森林中,寻找着隐藏的宝藏——商品类目信息。今天,我们将带领你一起,用Python这把锋利的剑,深入京东的神…...
双目视觉标定——1原理与实践
0 前言 双目视觉定位是目前机器(机器人)等领域中使用得非常广泛的视觉定位技术,双目视觉是模拟人的视觉系统利用两个不同位置的摄像头的视差来确定物体的位置。由于有需要采集两个摄像头的图像共同参与计算,所以双目相机装配要求…...
别再硬啃C++了!用LabVIEW玩转海康工业相机,从枚举设备到存BMP图保姆级教程
用LabVIEW轻松驾驭海康工业相机:从设备发现到图像保存全流程解析 工业视觉领域的技术门槛往往让许多开发者望而却步,尤其是面对复杂的C SDK文档时。但如果你熟悉LabVIEW的图形化编程环境,完全可以避开底层代码的困扰,快速实现海康…...
极客玩法:OpenClaw+千问3.5-35B-A3B-FP8实现智能家居控制中枢
极客玩法:OpenClaw千问3.5-35B-A3B-FP8实现智能家居控制中枢 1. 为什么需要AI控制智能家居? 去年装修新房时,我安装了全套HomeAssistant智能设备。但很快发现一个问题:不同品牌的设备需要各自APP控制,语音助手只能执…...
uniapp H5项目自定义favicon图标实战指南
1. 为什么需要自定义favicon图标 当你用uniapp开发H5项目时,有没有注意到浏览器标签页上那个默认的灰色地球图标?这个不起眼的小图标其实有个专业名称叫favicon,它就像是你网站的"身份证照片"。想象一下,用户同时打开十…...
Arduino_Cellular库深度解析:工业级4G通信底层实现
1. Arduino_Cellular 库深度解析:面向工业级4G通信的嵌入式底层实现Arduino_Cellular 是 Arduino 官方为 Pro 系列 4G 模块(EMEA 版与 Global 版)定制的底层通信库,其定位并非通用 AT 指令封装层,而是面向高可靠性工业…...
ViT推理超快
💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 ViT推理超快:突破实时视觉处理的瓶颈目录ViT推理超快:突破实时视觉处理的瓶颈 引言:从理论到…...
嵌入式差分升级技术解析与实践指南
1. 嵌入式差分升级方案概述在嵌入式设备固件更新领域,差分升级(Delta Update)已经成为解决传统OTA升级痛点的关键技术方案。作为一名长期从事嵌入式开发的工程师,我亲历过多次因固件体积过大导致的升级失败案例,直到采…...
M5ROTATE8库详解:8路旋转编码器I²C驱动与固件V2优化
1. 项目概述M5ROTATE8 是一款专为 M5Stack 生态中M5Unit-8Encoder(官方型号名:8ROTATE)模块设计的 Arduino C 库。该模块集成了8 路独立旋转编码器(Rotary Encoder)、8 个独立按键(Push Button)…...
如何用UI-Router构建复杂的AngularJS多视图应用:终极状态管理指南
如何用UI-Router构建复杂的AngularJS多视图应用:终极状态管理指南 【免费下载链接】ui-router The de-facto solution to flexible routing with nested views in AngularJS 项目地址: https://gitcode.com/gh_mirrors/ui/ui-router UI-Router是AngularJS中最…...
解锁学术新境界:书匠策AI——你的期刊论文智能导航员
在学术探索的浩瀚海洋中,每一位研究者都渴望拥有一盏明灯,照亮前行的道路,让复杂的论文写作之旅变得轻松而高效。今天,就让我们一同揭开书匠策AI的神秘面纱,探索它如何成为你撰写期刊论文时的得力助手与智能导航员。&a…...
DOM DocumentImpl:深入解析文档对象模型的核心实现
DOM DocumentImpl:深入解析文档对象模型的核心实现 引言 在Web开发领域,DOM(文档对象模型)是前端开发的基础,它允许开发者通过JavaScript操作HTML文档。DOM DocumentImpl是DOM的核心实现之一,它提供了丰富的API来操作文档结构。本文将深入解析DOM DocumentImpl,帮助开…...
