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

构建工程化:多种不同的工程体系如何编写MakeFile

源码分析

核心MakeFile

这个 Makefile 是一个复杂的构建脚本,用于管理和构建一个大型项目。它包括多个目标、条件判断和递归调用 make 命令来处理多个子项目和子目录。让我们逐部分进行详细解析。

伪目标和变量定义

.PHONY: all clean install build test init
  • .PHONY 目标声明了 allcleaninstallbuildtestinit 是伪目标,不对应实际文件。
PLATDIRS = newbuild so fantom share party www update var SIP-INSTALLROOT linux
CLEANDIRS = $(PLATDIRS) apps
  • PLATDIRSCLEANDIRS 是目录列表变量,用于后续的构建和清理操作。

模式规则

%.all :cd $* && $(MAKE)
%.clean :cd $* && $(MAKE) clean
%.build :cd $* && $(MAKE) build
  • 这三条规则定义了通用目标规则,对于目录列表中的每个目录,会进入该目录并执行相应的 make 目标(allcleanbuild)。

clean 目标

clean:rm -rf $(BUILD)/fantommake $(patsubst %, %.clean, $(CLEANDIRS))
  • clean 目标删除 $(BUILD)/fantom 目录,并调用 make 命令清理 CLEANDIRS 列表中的每个目录。

平台预构建目标

build_plat_pre:@chmod +x $(ROOT)/update/setbaseversion	@if [ ! -d $(BUILDROOT) ]; then mkdir -p $(BUILDROOT) ; fi@if [ ! -d $(BUILDROOT)/newbuild ]; then mkdir -p $(BUILDROOT)/newbuild ; fi@if [ ! -d $(BUILDROOT)/apps ]; then mkdir -p $(BUILDROOT)/apps ; fi@if [ ! -d $(BUILDROOT)/bin ]; then mkdir -p $(BUILDROOT)/bin ; fi@if [ ! -d $(BUILDROOT)/party ]; then mkdir -p $(BUILDROOT)/party ; fi@if [ ! -d $(BUILDROOT)/share/lib ]; then mkdir -p $(BUILDROOT)/share/lib ; fi@if [ ! -d $(BUILDROOT)/share/Python-2.7/lib ]; then mkdir -p $(BUILDROOT)/share/Python-2.7/lib ; fi
  • build_plat_pre 目标进行了一些预构建任务,包括设置文件权限和创建所需目录。

应用列表和目标

sis_apps_list = accessskeleton coengine dnsdetect ngfw saas secvisual server_anomaly super \wskiller update secdetect dgadetect httpdetector scandetect beforehanddetect \cloud_report webshelldetect wxscandetect brutedetect dosdetect netflow_forensic smbdetect \mailector secevent sec_dnsdetect sec_httpdetect sec_maildetect sec_netdetect sec_secdetect \sec_smbdetect sec_tidnsdetect sec_tihttpdetect sec_tiipdetect sec_thirdparty infoshare monitor \sec_filedetect sec_threatdetect documents agent
ifndef NO_SECLIB
sis_apps_list += seclib
endif
SISAPPS = $(patsubst %, apps/%, $(sis_apps_list))
  • sis_apps_list 定义了一个应用列表,包含多个应用名。
  • 如果未定义 NO_SECLIB,则将 seclib 添加到应用列表中。
  • SISAPPSsis_apps_list 转换为带有 apps/ 前缀的格式。

平台打包前置任务

plat_sis_pre:@python $(ROOT)/apps/super/plat/plat.py $(ROOT)/apps/super/plat/sis/plugins.conf
  • plat_sis_pre 目标运行一个 Python 脚本,用于配置或预处理。

平台打包

plat_sis: plat_sis_pre plat_fantom $(SISAPPS:=.build)
  • plat_sis 目标依赖于 plat_sis_preplat_fantom 和所有 SISAPPS.build 目标。

云平台应用列表和目标

cloud_apps_list = super cloud_report
CLOUDAPPS = $(patsubst %, apps/%, $(cloud_apps_list))
  • cloud_apps_list 定义了云平台的应用列表。
  • CLOUDAPPScloud_apps_list 转换为带有 apps/ 前缀的格式。
plat_cloud_pre:@python $(ROOT)/apps/super/plat/plat.py $(ROOT)/apps/super/plat/cloud/plugins.conf
  • plat_cloud_pre 目标运行一个 Python 脚本,用于云平台的预处理。
plat_cloud: plat_cloud_pre plat_fantom $(CLOUDAPPS:=.build)
  • plat_cloud 目标依赖于 plat_cloud_preplat_fantom 和所有 CLOUDAPPS.build 目标。

平台基础内容打包

plat_fantom: build_plat_pre $(PLATDIRS:=.build)@cd $(BUILD) && tar -czf fantom.tar.gz fantom
  • plat_fantom 目标依赖于 build_plat_pre 和所有 PLATDIRS.build 目标。
  • 它会进入 $(BUILD) 目录并将 fantom 目录打包成 fantom.tar.gz

应用打包预处理

build_apps_pre:@if [ ! -d "$(BUILDROOT)/apps" ]; then mkdir -p "$(BUILDROOT)/apps" ; fi
  • build_apps_pre 目标确保 $(BUILDROOT)/apps 目录存在。

应用打包

plat_apps: build_apps_pre
ifdef NAME@if [ -d $(ROOT)/apps/$(NAME) ]; then \cd "$(ROOT)/apps/$(NAME)" && make build; 	\cd "$(ROOT)/update" && make build; 	\cd $(BUILD)/fantom/apps/ && tar -czf $(NAME).tar.gz $(NAME);	\mv $(NAME).tar.gz $(BUILD);\else \echo "App $(NAME) not exists";	\fi
else
endif
  • plat_apps 目标依赖于 build_apps_pre

  • 如果定义了 NAME 变量并且 $(ROOT)/apps/$(NAME) 目录存在,则

    • 进入 $(ROOT)/apps/$(NAME) 并执行 make build
    • 进入 $(ROOT)/update 并执行 make build
    • $(BUILD)/fantom/apps/$(NAME) 目录打包成 $(NAME).tar.gz,并移动到 $(BUILD) 目录。
  • 如果 $(ROOT)/apps/$(NAME) 目录不存在,则输出错误信息。

总结

这个 Makefile 用于构建和打包一个复杂的项目,包含多个应用和平台组件。它通过定义变量和模式规则来管理不同的构建任务,并使用条件判断和递归调用 make 命令来处理各个子目录和应用的构建过程。

php

TYPE = dirifdef NO_SECLIB
dirs := $(shell find . -maxdepth 1 -path ./seclib -prune -o -type d -print)
else
dirs := $(shell find . -maxdepth 1 -type d)
endifdirs := $(basename $(patsubst ./%,%,$(dirs)))SUBDIRS = $(dirs)include $(MAKEFILEDIR)/Makefile.$(TYPE)

这个 Makefile 代码片段通过使用条件和 shell 命令来动态生成子目录列表,并根据一个特定的类型包含相应的 Makefile。让我们逐行解析这个 Makefile 片段

代码解析

TYPE = dir
  • 这行定义了一个变量 TYPE,其值为 dir。这个变量在后续的 include 语句中被使用。
ifdef NO_SECLIB
dirs := $(shell find . -maxdepth 1 -path ./seclib -prune -o -type d -print)
else
dirs := $(shell find . -maxdepth 1 -type d)
endif
  • 这里使用了条件判断 ifdef 来检测是否定义了 NO_SECLIB 变量。

  • 如果定义了 NO_SECLIB,则执行第一条命令

    dirs := $(shell find . -maxdepth 1 -path ./seclib -prune -o -type d -print)
    
    • 这条命令使用 find 命令查找当前目录(不包括子目录)的所有目录,但排除了 ./seclib 目录。
    • -maxdepth 1 限制查找深度为当前目录。
    • -path ./seclib -prune 用于排除 ./seclib 目录。
    • -o -type d -print 查找类型为目录并打印路径。
  • 否则(如果未定义 NO_SECLIB),则执行第二条命令

    dirs := $(shell find . -maxdepth 1 -type d)
    
    • 这条命令使用 find 命令查找当前目录(不包括子目录)的所有目录。
dirs := $(basename $(patsubst ./%,%,$(dirs)))
  • 这行代码使用了 patsubstbasename 函数对 dirs 变量进行处理

    • $(patsubst ./%,%,$(dirs)) 移除每个目录路径前面的 ./ 前缀。
    • $(basename $(patsubst ./%,%,$(dirs))) 进一步处理每个目录路径,只保留目录名称。
SUBDIRS = $(dirs)
  • 将处理后的目录列表赋值给变量 SUBDIRS
include $(MAKEFILEDIR)/Makefile.$(TYPE)
  • 包含另一个 Makefile 文件。文件的路径和名称由 $(MAKEFILEDIR)/Makefile.$(TYPE) 决定。
    • $(MAKEFILEDIR) 是另一个变量,通常在其他地方定义,用于指定 Makefile 文件所在的目录。
    • $(TYPE) 变量的值为 dir,所以这行等价于 include $(MAKEFILEDIR)/Makefile.dir

总结

这个 Makefile 片段的目的是

  • 动态生成当前目录下的子目录列表,并处理排除某些特定目录(如 seclib)。
  • 处理目录路径,将它们标准化为不带 ./ 前缀的格式。
  • 将处理后的目录列表赋值给 SUBDIRS 变量。
  • 根据 TYPE 变量的值,包含另一个 Makefile 文件,便于分层和模块化管理构建过程。

通过这种方式,可以根据不同的条件动态调整构建过程,灵活应对各种需求和依赖关系。

python

TYPE = appSUBDIRS =.PHONY: build cleanappversion=`date "+%Y%m%d/%H:%M:%S"`build:@find ./appserver -name .svn | xargs rm -rf@find ./bin -name .svn | xargs rm -rf@find ./default -name .svn | xargs rm -rf@find ./lib -name .svn | xargs rm -rf@find ./local -name .svn | xargs rm -rf@find ./var -name .svn | xargs rm -rf@find ./meta-info -name .svn | xargs rm -rf@rwini -w -s info -k version -f libinfo -v $(appversion)@mkdir -p ./patch0/$(notdir $(CURDIR))@mv -f ./appserver ./patch0/$(notdir $(CURDIR))/appserver@mv -f ./bin ./patch0/$(notdir $(CURDIR))/bin@mv -f ./default ./patch0/$(notdir $(CURDIR))/default@mv -f ./lib ./patch0/$(notdir $(CURDIR))/lib@mv -f ./local ./patch0/$(notdir $(CURDIR))/local@mv -f ./var ./patch0/$(notdir $(CURDIR))/var@cp -rf ./libinfo ./patch0/$(notdir $(CURDIR))/libinfo@cp -rf ./meta-info/update ./patch0@cp -rf ./meta-info ./patch0/$(notdir $(CURDIR))/meta-info@zip -r -q $(notdir $(CURDIR)).zip patch0 libinfo meta-info@rm -rf ./libinfo@rm -rf ./meta-info@rm -rf ./patch0@if [ ! -d "$(BUILDROOT)/apps/$(notdir $(CURDIR))" ]; then mkdir -p "$(BUILDROOT)/apps/$(notdir $(CURDIR))" ; fi@rsync -r . "$(BUILDROOT)/apps/$(notdir $(CURDIR))" --exclude="Makefile" --exclude='.svn/'
clean:@rm -f $(notdir $(CURDIR)).zip

这个 Makefile 定义了两个主要目标
buildclean。它主要用于清理项目目录中的 .svn 文件夹、更新版本信息、组织项目文件,并将其打包成压缩文件。下面是对每一部分的详细解析

变量和伪目标

TYPE = app
SUBDIRS =
.PHONY: build clean
  • TYPE = app
    定义了一个变量 TYPE,其值为 app。虽然在这个 Makefile 中没有进一步使用,但它可以用来在包含的其他 Makefile 中使用。
  • SUBDIRS =
    定义了一个空的 SUBDIRS 变量。在这个 Makefile 中没有实际使用。
  • .PHONY: build clean
    声明了两个伪目标 buildclean,这表示这些目标不是实际的文件名,而是任务名称。

版本信息

appversion=`date "+%Y%m%d/%H:%M:%S"`
  • appversion 变量用来保存当前的日期和时间,格式为 YYYYMMDD/HH:MM:SS。这个变量会用于更新版本信息。

build 目标

build:@find ./appserver -name .svn | xargs rm -rf@find ./bin -name .svn | xargs rm -rf@find ./default -name .svn | xargs rm -rf@find ./lib -name .svn | xargs rm -rf@find ./local -name .svn | xargs rm -rf@find ./var -name .svn | xargs rm -rf@find ./meta-info -name .svn | xargs rm -rf@rwini -w -s info -k version -f libinfo -v $(appversion)@mkdir -p ./patch0/$(notdir $(CURDIR))@mv -f ./appserver ./patch0/$(notdir $(CURDIR))/appserver@mv -f ./bin ./patch0/$(notdir $(CURDIR))/bin@mv -f ./default ./patch0/$(notdir $(CURDIR))/default@mv -f ./lib ./patch0/$(notdir $(CURDIR))/lib@mv -f ./local ./patch0/$(notdir $(CURDIR))/local@mv -f ./var ./patch0/$(notdir $(CURDIR))/var@cp -rf ./libinfo ./patch0/$(notdir $(CURDIR))/libinfo@cp -rf ./meta-info/update ./patch0@cp -rf ./meta-info ./patch0/$(notdir $(CURDIR))/meta-info@zip -r -q $(notdir $(CURDIR)).zip patch0 libinfo meta-info@rm -rf ./libinfo@rm -rf ./meta-info@rm -rf ./patch0@if [ ! -d "$(BUILDROOT)/apps/$(notdir $(CURDIR))" ]; then mkdir -p "$(BUILDROOT)/apps/$(notdir $(CURDIR))" ; fi@rsync -r . "$(BUILDROOT)/apps/$(notdir $(CURDIR))" --exclude="Makefile" --exclude='.svn/'
清理 .svn 文件夹
  • 使用 find 命令查找并删除各个目录下的 .svn 文件夹,这些文件夹是 Subversion (SVN) 版本控制系统的目录,不需要打包到最终的发布版本中。
更新版本信息
  • 使用 rwini 命令更新 libinfo 文件中的版本信息,rwini 是一个假设的工具,用于写入 INI 文件格式中的值。具体操作是设置 [info] 节点中的 version 键为当前时间。
组织项目文件
  • 创建一个名为 patch0 的目录,并将各个子目录(如 appserverbindefaultliblocalvar)移动到 patch0/$(notdir $(CURDIR)) 中。
    • $(notdir $(CURDIR)) 获取当前目录的名称(不包括路径),例如,如果当前目录是 /home/user/project,则 $(notdir $(CURDIR)) 会得到 project
复制和压缩文件
  • libinfometa-info 目录复制到 patch0 下的相应位置。
  • 使用 zip 命令将 patch0libinfometa-info 压缩成一个 zip 文件,名称为当前目录名称加 .zip(例如 project.zip)。
  • 删除 libinfometa-infopatch0 目录。
同步文件
  • 如果 $(BUILDROOT)/apps/$(notdir $(CURDIR)) 目录不存在,则创建它。
  • 使用 rsync 命令将当前目录的内容(除了 Makefile.svn 文件夹)同步到 $(BUILDROOT)/apps/$(notdir $(CURDIR)) 目录。

clean 目标

clean:@rm -f $(notdir $(CURDIR)).zip
  • 删除以当前目录名称命名的 zip 文件(例如 project.zip)。

总结

  • 这个 Makefile 主要用于清理项目目录中的 .svn 文件夹,更新版本信息,组织和打包项目文件,并将其同步到一个特定的构建目录。
  • build 目标执行了所有这些步骤,而 clean 目标仅删除生成的 zip 文件。
  • 使用了 shell 命令和 rwini 工具来处理文件和目录,动态生成版本信息,并打包和同步项目文件。

相关文章:

构建工程化:多种不同的工程体系如何编写MakeFile

源码分析 核心MakeFile 这个 Makefile 是一个复杂的构建脚本,用于管理和构建一个大型项目。它包括多个目标、条件判断和递归调用 make 命令来处理多个子项目和子目录。让我们逐部分进行详细解析。 伪目标和变量定义 .PHONY: all clean install build test init.…...

聚焦从业人员疏散逃生避险意识能力提升,推动生产经营单位每年至少组织开展(疏散逃生演练,让全体从业人员熟知逃生通道、安全出口及应急处置要求,形成常态化机制。

聚焦从业人员疏散逃生避险意识能力提升,推动生产经营单位每年至少组织开展(疏散逃生演练,让全体从业人员熟知逃生通道、安全出口及应急处置要求,形成常态化机制。完整试题答案查看 A.三次B.两次C.一次 综合运用“四不两直”、明察暗访、 ()、…...

【手机取证】如何使用360加固助手给apk加固

文章关键词:手机取证、电子数据取证、数据恢复 一、前言 APP加固是对APP代码逻辑的一种保护。原理是将应用文件进行某种形式的转换,包括不限于隐藏,混淆,加密等操作,进一步保护软件的利益不受损坏,下面给…...

Vue的介绍

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...

MySql数据库常用指令合集

MySql数据库常用指令合集 一、创建数据库db11.创建表 字段---表头 student_no,username,sex2.新增单条插入多条插入3.删除4.更新5.查询5.1.查询该表全部信息5.2.查询该表中username,并且要求名字为zhangsan性别女,还可以用(or) 6.…...

ArcGIS Pro SDK (七)编辑 13 注解

ArcGIS Pro SDK (七)编辑 13 注解 文章目录 ArcGIS Pro SDK (七)编辑 13 注解1 注释构建工具2 以编程方式启动编辑批注3 更新批注文本4 修改批注形状5 修改批注文本图形6 接地到网格 环境:Visual Studio 2022 .NET6 …...

模拟面试001-Java开发工程师+简历+问题+回答

模拟面试001-Java开发工程师简历问题回答 目录 模拟面试001-Java开发工程师简历问题回答面试简历面试官题问求职者回答1. 关于Java编程和技术栈2. 关于XX在线购物平台项目3. 关于XX企业资源规划系统项目4. 团队协作与项目管理5. 个人发展与职业规划 参考资料 面试简历 **个人信…...

微信小程序 ——入门介绍及简单的小程序编写

目录 一、小程序入门 1.1 什么是小程序 1.2 小程序的优点 1.3 小程序注册 1.4 安装开发工具 1.5 创建第一个小程序 二、小程序目录结构及入门案例 2.1 目录结构 2.2 入门案例 2.2.1 创建界面 2.2.2 设置标题 2.2.3 编写WXML文件 2.2.4 编写JS文件 2.2.5 编写WXSS…...

ubuntu20.04安装lio-sam

1、依赖功能包安装 sudo apt install ros-noetic-robot-state-publisher sudo apt-get install ros-noetic-robot-localization libmetis-dev 2、boost版本 boost版本查看:cat /usr/include/boost/version.hpp | grep "BOOST_LIB_VERSION" boost版本为1.…...

Kafka系列之Kafka知识超强总结

一、Kafka简介 Kafka是什么 Kafka是一种高吞吐量的分布式发布订阅消息系统(消息引擎系统),它可以处理消费者在网站中的所有动作流数据。 这种动作(网页浏览, 搜索和其他用户的行动)是在现代网络上的许多社…...

第32讲:K8S集群与Cephfs文件系统集成

文章目录 1.在K8S环境下RBD与Cephfs的使用对比2.Cephfs环境介绍3.在Ceph集群中为K8S创建单独Cephfs文件系统和认证用户3.1.创建一个K8S使用的Cephfs文件系统3.2.将创建的Cephfs文件系统挂载到本地路径3.3.创建K8S连接Ceph集群使用的认证用户 4.K8S PV存储卷使用Cephfs文件系统4…...

服务器数据恢复—DS5300存储raid5阵列数据恢复案例

服务器存储数据恢复环境: 某单位一台某品牌DS5300存储,1个机头4个扩展柜,50块硬盘组建2组RAID5磁盘阵列(一组raid5阵列有27块成员盘,存放Oracle数据库文件;另外一组raid5阵列有23块成员盘)。存储…...

使用Ubuntu 22.04安装Frappe-Bench【二】

系列文章目录 第一章 使用VMware创建Ubuntu 22.04【一】 文章目录 系列文章目录前言什么是Frappe-Bench?使用安装ERPNext能实现什么效果? 官网给了一个说明 一、使用Ubuntu 22.04安装Frappe-Bench一、安装要求二、安装命令三、 可能出现问题 总结 前言 …...

MySQL增删改查

1.创建数据库: 使用CREATE DATABASE语句 CREATE DATABASE school;show databases; 列出MySQL数据库管理系统的数据库列表 2.切换数据库: 使用USE语句选择要操作的数据库 USE school;select database (); 当前所在库mysql> select…...

Java跳出循环的四种方式

1、continue,break,return continue:跳出当前层循环的当前语句,执行当前层循环的下一条语句。   continue标签 break:跳出当前层循环。 break标签:多层循环时,跳到具体某层循环。 return:结束所有循环…...

直播预告|飞思实验室暑期公益培训7月10日正式开启,报名从速!

01 培训背景 很荣幸地向大家宣布:卓翼飞思实验室将于7月10日正式开启为期两个月的暑期公益培训!本次培训为线上直播,由中南大学计算机学院特聘副教授,RflySim平台总研发负责人戴训华副教授主讲。 培训将基于“RflySim—智能无人…...

3-2 梯度与反向传播

3-2 梯度与反向传播 主目录点这里 梯度的含义 可以看到红色区域的变化率较大,梯度较大;绿色区域的变化率较小,梯度较小。 在二维情况下,梯度向量的方向指向函数增长最快的方向,而其大小表示增长的速率。 梯度的计算 …...

【qt】如何获取本机的IP地址?

需要用到这个类QHostInfo和pro里面添加network模块 用这个类的静态函数forName()来获取该主机名的信息 返回的就是这个类 这个QHostInfo类就包括主机的IP地址信息 用静态函数addresses()来获取 返回的是一个QHostAddress的容器 QList<QHostAddress>addrList hostIn…...

芯片的PPA-笔记

写在前面&#xff1a;这个仅记录自己对芯片PPA的一些思考&#xff0c;不一定正确&#xff0c;还请各位网友思辨的看待&#xff0c;欢迎大家谈谈自己的想法。 1 此次笔记的起因 记录的原因&#xff1a;自己在整理这段时间的功耗总结&#xff0c;又看到工艺对功耗的影响&#x…...

2024阿里巴巴全球数学竞赛决赛中的数列题解析(分析与方程方向第4题)

早点关注我&#xff0c;精彩不错过&#xff01; 上周给大家聊了一道有LLM背景的阿里数赛题&#xff0c;详情请戳&#xff1a; 2023阿里巴巴全球数学竞赛决赛中的LLM背景题解析&#xff08;应用与计算数学部分第2题&#xff09; 看起来大家还比较喜欢看这种具体问题求解和思路分…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

Linux中《基础IO》详细介绍

目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改&#xff0c;实现简单cat命令 输出信息到显示器&#xff0c;你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...

加密通信 + 行为分析:运营商行业安全防御体系重构

在数字经济蓬勃发展的时代&#xff0c;运营商作为信息通信网络的核心枢纽&#xff0c;承载着海量用户数据与关键业务传输&#xff0c;其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级&#xff0c;传统安全防护体系逐渐暴露出局限性&a…...

规则与人性的天平——由高考迟到事件引发的思考

当那位身着校服的考生在考场关闭1分钟后狂奔而至&#xff0c;他涨红的脸上写满绝望。铁门内秒针划过的弧度&#xff0c;成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定"&#xff0c;构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...

UE5 音效系统

一.音效管理 音乐一般都是WAV,创建一个背景音乐类SoudClass,一个音效类SoundClass。所有的音乐都分为这两个类。再创建一个总音乐类&#xff0c;将上述两个作为它的子类。 接着我们创建一个音乐混合类SoundMix&#xff0c;将上述三个类翻入其中&#xff0c;通过它管理每个音乐…...