Linux:Makefile
编译器gcc
使用方式:gcc [ 选项 ] 要编译的⽂件 [ 选项 ] [ ⽬标⽂件 ]
编译分为以下几个步骤:
1.预处理(进⾏宏替换)
预处理功能主要包括宏定义,⽂件包含,条件编译,去注释等。
预处理指令是以#号开头的代码⾏。
实例:
gcc –E hello.c –o hello.i
选项“-E”,该选项的作⽤是让gcc在预处理结束后停⽌编译过程。
选项“-o”是指⽬标⽂件,“.i”⽂件为已经过预处理的C原始程序。
2.编译(⽣成汇编)
在这个阶段中,gcc⾸先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的⼯作, 在检查⽆误后,gcc把代码翻译成汇编语⾔。
⽤⼾可以使⽤“-S”选项来进⾏查看,该选项只进⾏编译⽽不进⾏汇编,⽣成汇编代码。
实例:
gcc –S hello.i –o hello.s
3.汇编(⽣成机器可识别代码)
汇编阶段是把编译阶段⽣成的“.s”⽂件转成⽬标⽂件
读者在此可使⽤选项“-c”就可看到汇编代码已转化为“.o”的⼆进制⽬标代码了
实例:
gcc –c hello.s –o hello.o
4.连接(⽣成可执⾏⽂件或库⽂件)
在成功编译之后,就进⼊了链接阶段。
实例:
gcc hello.o –o hello
动态链接和静态链接
在实际开发中,不可能将所有代码放在⼀个源⽂件中,所以会出现多个源⽂件,⽽且多个源⽂件之间不是独⽴的,⽽会存在多种依赖关系,如⼀个源⽂件可能要调⽤另⼀个源⽂件中定义的函数, 但是每个源⽂件都是独⽴编译的,即每个*.c⽂件会形成⼀个*.o⽂件,为了实现这种依赖关系,则需要将这些源⽂件产⽣的⽬标⽂件进⾏链接,从⽽形成⼀个可以执⾏的程序。这个链接的过程就是静态链接。
静态链接的缺点很明显:
浪费空间:因为每个可执⾏程序中对所有需要的⽬标⽂件都要有⼀份副本,所以如果多个程序对 同⼀个⽬标⽂件都有依赖,如多个程序中都调⽤了printf()函数,则这多个程序中都含有 printf.o,所以同⼀个⽬标⽂件都在内存存在多个副本;
更新⽐较困难:因为每当库函数的代码修改了,这个时候就需要重新进⾏编译链接形成可执⾏程 序。
但是静态链接的优点就是,在可执⾏程序中已经具备了所有执⾏程序所需要的任何东西,在执⾏的时候运⾏速度快。
而动态链接则是把程序按照模块拆分成各个相对独⽴的部分,在程序运⾏时才将它们链接在⼀起形成⼀个完整的程序,⽽不是像静态链接⼀样把所有程序模块都链接成⼀个单独的可执⾏⽂件。
静态库和动态库
静态库是指编译链接时,把库⽂件的代码全部加⼊到可执⾏⽂件中,因此⽣成的⽂件⽐较⼤,但在运⾏时也就不再需要库⽂件了。
其后缀名⼀般为“.a”
动态库与之相反,在编译链接时并没有把库⽂件的代码加⼊到可执⾏⽂件中,⽽是在程序执⾏时由运⾏时链接⽂件加载库,这样可以节省系统的开销。
动态库⼀般后缀名为“.so”。
gcc在编译时默认使⽤动态库。完成了链接之后,gcc就可以⽣成可执⾏⽂件,
如:
gcc hello.o –o hello
gcc默认⽣成的⼆进制程序,是动态链接的。
make/Makefile
对于一个内容复杂、源文件众多的工程而言,仅使用gcc指令对其文件进行逐个编译会显得过于繁琐低效,因此linux提供了一个对工程进行自动编译的指令:make
make实际执行的是一个名为makefile的文件内的指令(该文件由用户自己创建)
因此,我们要想编译一个工程,不妨写一个makefile文件,这样每次编译时只需调用make指令即可
写makefile的思路:
形成目标文件的依赖关系(即由什么文件生成)+依赖方法(即如何生成)
以一个简单的makefile文件为例:
code:code.c
gcc -o code code.c
.PHONY:clean
clean:
rm -f code
依赖关系:形成code⽂件依赖于code.c
依赖⽅法:gcc -o myproc myproc.c
项⽬清理 :删除所有的目标文件
make是如何⼯作的
1. make会在当前⽬录下寻找名为“Makefile”或“makefile”的⽂件。
2. 如果找到,它会找⽂件中的第⼀个⽬标⽂件(target),在上⾯的例⼦中,他会找到code⽂件,并把这个⽂件作为最终的⽬标⽂件。
3. 如果 code ⽂件不存在,或是依赖文件code.c与目标文件code相比更新(即文件修改时间更晚),那么,他就会执⾏后⾯所定义的命令来⽣成 myproc 这个⽂件。
4. 如果 code 所依赖的 code.c ⽂件不存在,那么 make 会在当前⽂件中找⽬标文件为 code.c的依赖文件,如果找到则根据上述规则形成code.c⽂件(这里是一个递归调用,即不断寻找依赖文件,当找到最后一个依赖文件时,开始依次执行依赖方法)。
5. 在找寻的过程中,如果出现错误,⽐如最后被依赖的⽂件找不到,那么make就会直接退出,并 报错,⽽对于所定义的命令的错误,或是编译不成功,make不做处理。
clean
clean也是一个目标文件,但它不依赖于任何文件,也不与其他的目标文件直接或间接关联,这导致它后⾯所定义的命令将不会被⾃动执⾏,不过,我们仍然可以使用指令“make clean”来显式执⾏,以此来清除所有的⽬标⽂件,以便重编译。
而.PHONY则是将clean修饰为伪目标,效果是:让make忽略源⽂件和可执⾏⽬标⽂件的M时间对⽐(直白的讲就是clean可以总是被执行)
什么是总是被执行
当我们查看一个文件的信息注意到:
Access :⽂件最后⼀次被访问的时间。
Modify: 文件内容最后一次变更的时间
Change :文件属性最后一次变更的时间
当目标文件的修改时间晚于依赖文件时,此时编译器会认为目标文件已由依赖文件形成,不需再执行,而总是被执行就是无论目标文件的修改实际是否晚于依赖文件,命令都会被执行
Makefile的扩展语法
BIN=code
CC=gcc
#SRC=$(shell ls *.c) #采⽤shell命令⾏⽅式,获取当前所有.c⽂件名
SRC=$(wildcard *.c) #或者使⽤wildcard 函数,获取当前所有.c⽂件名
OBJ=$(SRC:.c=.o) #将SRC的所有同名.c 替换成为.o 形成⽬标⽂件列表
LFLAGS=-o #链接选项
FLAGS=-c #编译选项
RM=rm -f #引⼊命令 $(BIN):$(OBJ) @$(CC) $(LFLAGS) $@ $^ # $@:代表⽬标⽂件名。$^: 代表依赖⽂件列表@echo "linking ... $^ to $@"
%.o:%.c # %.c: 展开当前⽬录下所有的.c。%.o: 同时展开同名.o@$(CC) $(FLAGS) $< # %<: 对展开的依赖.c⽂件,⼀个⼀个的交给gcc。
@echo "compling ... $< to $@" # @:不回显命令
.PHONY:clean
clean:$(RM) $(OBJ) $(BIN) # $(RM): 替换,⽤变量内容替换它.PHONY:test
test: @echo $(SRC) @echo $(OBJ)
相关文章:
Linux:Makefile
编译器gcc 使用方式:gcc [ 选项 ] 要编译的⽂件 [ 选项 ] [ ⽬标⽂件 ] 编译分为以下几个步骤: 1.预处理(进⾏宏替换) 预处理功能主要包括宏定义,⽂件包含,条件编译,去注释等。 预处理指令是以#号开头的代码⾏。 实例: gcc –E hello.c –o hello…...
下篇:《高阶排序算法:分治思想与性能突破》
个人主页:strive-debug 1. 堆排序(Heap Sort) - **核心思想**:利用 **大根堆(升序)** 或 **小根堆(降序)** 进行选择排序。 - **关键步骤**: 1. **建堆**(…...
5G时代,视频分析设备平台EasyCVR实现通信基站远程安全便捷管控
一、背景介绍 随着移动通信行业的快速发展,各大运营商不断建设越来越多的无人值守通信基站。这些基站大多位于偏远地区,人烟稀少且交通不便,给日常维护带来了许多不便。特别是安装在空旷地带的基站设备,如空调、蓄电池等…...
第 4 篇:Motion 拖拽与手势动画(交互篇)—— 打造直觉化交互体验
Framer Motion 的拖拽与手势系统让实现复杂交互变得异常简单。本文将深入解析核心 API,并通过实战案例演示如何创造自然流畅的交互体验。 🧲 拖拽动画基础 1. 启用拖拽 使用 drag 属性即可开启拖拽能力。支持的值有:true(全方向…...
TDengine 语言连接器(R语言)
简介 R 语言是一种用于统计分析、绘图和数据挖掘的编程语言和软件环境 。 TDengine 支持 R 语言访问 TDengine 数据库,通过 R 语言中的 RJDBC 库可以使 R 语言程序支持访问 TDengine 数据。 以下是安装过程、配置过程以及 R 语言示例代码。 安装过程 在开始之前&…...
Vue Router(3)- 历史记录模式、路由元信息
历史记录模式 Vue Router 支持多种历史管理模式,主要区别在于 URL 的表现形式和页面刷新/直接访问时的处理方式。 如果需要最好的兼容性或没有服务器配置权限,使用 Hash 模式 如果需要干净的 URL 并能配置服务器,使用 History 模式ÿ…...
android studio 运行java main报错
运行某个带main函数的java文件报错 Could not create task :app:Test.main(). > SourceSet with name main not found. 解决办法:在工程的.idea/gradle.xml 文件下添加: <option name"delegatedBuild" value"false" /&g…...
TDengine 3.3.6.3 虚拟表简单验证
涛思新出的版本提供虚拟表功能,完美解决了多值窄表查询时需要写程序把窄表变成宽表的处理过程,更加优雅。 超级表定义如下: CREATE STABLE st01 (ts TIMESTAMP,v0 INT,v1 BIGINT,v2 FLOAT,v3 BOOL) TAGS (device VARCHAR(32),vtype VARCHAR(…...
什么是进程?
目录 冯诺依曼体系 操作系统(OperatorSystem) 设计OS的目的 进程 task_struct 操作 /proc文件夹 父子进程 创建子进程 了解进程之前,我们先说说冯诺依曼体系结构,这是计算机硬件方面的知识。 冯诺依曼体系 我们常见的计算机,如笔记…...
mysql备份存储过程、函数和事件
背景 今天还原mysql数据库备份发现,数据库中没有存储过程和函数,虽然不推荐研发使用数据库的函数、存储过程,但还是免不了有人偶尔使用,所以整理备份和还原策略。 数据库备份 mysqldump -u user -p --routines --triggers --ev…...
【正点原子STM32MP257连载】第五章 ATK-DLMP257B文件系统简介 #文件系统 #SSH
1)实验平台:正点原子ATK-DLMP257B开发板 2)浏览产品:https://www.alientek.com/Product_Details/135.html 3)全套实验源码手册视频下载:正点原子资料下载中心 文章目录 第五章 ATK-DLMP257B文件系统简介5.1…...
实战5:Python使用循环神经网络生成诗歌
实战5:Python使用循环神经网络生成诗歌 使用依赖加载数据词典构建和文本预处理总代码 在我们学习了课程8后,我们在实战练习一个例子。 你的主要任务:学习如何使用简单的循环神经网络(Vanilla RNN)生成诗歌。亚历山大谢…...
【网络安全】谁入侵了我的调制解调器?(二)
文章目录 针对 TR-069 协议 REST API 的攻击思路攻击百万台调制解调器意外发现 Cox 后端 API 的授权绕过漏洞确认我们能够进入任何人的设备访问和更新任何Cox商业客户账户通过泄露的加密密钥覆盖任何人的设备设置执行对任何调制解调器的命令影响最后想说阅读本文前,请先行浏览…...
当纺织车间遇上“数字魔法”--天拓四方飞鸟物联平台+边缘计算采集网关的智造革命
在传统印象里,纺织车间总是机器轰鸣、纱线纷飞,工人穿梭其间手动调整参数,次品率全凭经验“拿捏”。但如今,某纺织龙头企业的智能工厂里,一台台纺织机像被施了“聪明咒”,自己会“说话”、会“思考”&#…...
基于PLC的停车场车位控制系统的设计
2.1 设计目标 本课题为基于PLC的停车场车位控制系统来设计,在此将功能确定如下: 针对8个车位的停车场进行设计将停车场分为入口处,车位处、以及出口处三个部分;每个车位都有指示灯指示当前位置是否空闲,方便司机查找空…...
ios接入穿山甲【Swift】
1.可接入的广告,点击右下角查看接入文档 https://www.csjplatform.com/union/media/union/download/groMore 2.进入接入文档,选择最新版本进行接入 pod Ads-CN-Beta,6.8.0.2pod GMGdtAdapter-Beta, 4.15.22.0pod GDTMobSDK,4.15.30pod KSAdSDK,3.3.74.0p…...
【iOS】OC高级编程 iOS多线程与内存管理阅读笔记——自动引用计数(二)
自动引用计数 前言ARC规则所有权修饰符**__strong修饰符**__weak修饰符__unsafe_unretained修饰符__autoreleasing修饰符 规则属性数组 前言 上一篇我们主要学习了一些引用计数方法的内部实现,现在我们学习ARC规则。 ARC规则 所有权修饰符 OC中,为了处…...
智能语音识别+1.2用SAPI实现文本转语音(100%教会)
欢迎来到智能语音识别系列的第二篇文章. 上一篇文章的地址在这:智能语音处理1.1下载需要的库(100%实现)-CSDN博客 想必上一篇的操作(文本转语音)已经成功实现了 接下来,我们要学习用SAPI技术去实现文本转语音 一.简单介绍SAPI技术 SAPI是架构在COM基础上的,微软…...
Unity导出微信小游戏后无法调起移动端输入框
参考官方demo 参考demo https://gitee.com/wechat-minigame/minigame-unity-webgl-transform/tree/main/Demo/API_V2 里面有对输入文本框适配的处理方法,还有一些其他功能展示 1 使用Unity打开/Demo/API目录,API示例开发版本为Unity 2022.3.14f1。 2 若…...
16.使用豆包将docker-compose的yaml转为k8s的yaml,安装各种无状态服务
文章目录 docker方式httpbinit-toolslinux-commandmyipreference docker-compose安装k8s方式 docker方式 httpbin A simple HTTP Request & Response Service https://httpbin.org/ https://github.com/postmanlabs/httpbin https://github.com/mccutchen/go-httpbin do…...
每日OJ_牛客_kotori和抽卡(二)_数学_C++_Java
目录 牛客_孩子们的游戏_约瑟夫环 题目解析 C代码 Java代码 牛客_孩子们的游戏_约瑟夫环 孩子们的游戏(圆圈中最后剩下的数)_牛客题霸_牛客网 描述: 每年六一儿童节,牛客都会准备一些小礼物和小游戏去看望孤儿院的孩子们。其中,有个游戏…...
整活 kotlin + springboot3 + sqlite 配置一个 SQLiteCache
要实现一个 SQLiteCache 也是很简单的只需要创建一个 cacheManager Bean 即可 // 如果配置文件中 spring.cache.sqlite.enable false 则不启用 Bean("cacheManager") ConditionalOnProperty(name ["spring.cache.sqlite.enable"], havingValue "t…...
JVM:运行时数据区和线程
一、运行时数据区概述 (1)整体架构 JVM 启动时,操作系统会为它分配相应的内存空间,接着 JVM 会对分配到的空间进行划分。当 JVM 退出,这些空间会被回收。JVM 将分配到的内存空间主要分成五部分:程序计数器…...
Lucene.NET + Jieba分词:核心词典与停用词配置详解
文章目录 前言一、dict.txt:核心分词词典1. 文件作用2. 文件格式3. 配置方法 二、cn_synonym.txt:同义词扩展库1. 文件作用2. 文件格式3. 在 Lucene 中使用 三、stopwords.txt:停用词表1. 文件作用2. 文件格式3. 配置方法 四、实战࿱…...
软件测试之测试数据生成(Excel版)
这是Excel生成测试数据的函数使用 1.时间 1.1.时间 例生成2022-05-01之前一年内任意时间点: =TEXT("2022-05-01"-RAND()-RANDBETWEEN(1,365),"yyyy-mm-dd hh:mm:ss")1.2.年月日 yyyy-mm-dd 以当前时间生成10年的日期 =TEXT(NOW()-RAND()-RANDBETWE…...
局域网内Docker镜像共享方法
在局域网内将Docker镜像构建并传输到另一台电脑,可以通过以下几种方法实现。以下是具体步骤及注意事项,结合不同场景的适用方案: 方法一:使用 docker save 和 docker load 传输镜像文件 步骤说明 在构建机上保存镜像 通过 docker…...
解决WinEdt编辑器出现文字不会适应软件宽度的问题
解决WinEdt编辑器出现文字不会适应软件宽度的问题 问题描述解决 问题描述 在使用WinEdt编辑Latex文本时,发现突然动了下键盘,或者突然就在编辑文本时不能自动换行,而是超出了软件屏幕的宽度。 解决 按住ctrl w ,直到界面变成下…...
跨境电商管理转型:日事清通过目标管理、流程自动化助力智优美科技项目管理升级与目标落地复盘
1.客户背景介绍 深圳市智优美科技有限公司是一家专业从事外贸B2C的电子商务公司,公司总部位于深圳市宝安区,旗下拥有三家子公司。目前销售的品类有:家居用品、电子产品、电子配件产品等,在深圳外贸电商行业销售额稳居行业前10名。…...
高防CDN、高防IP vs 高防服务器:核心优势与选型指南
一、高防服务器的核心局限 高防服务器是指通过机房部署硬件防火墙(如集群防火墙、流量清洗设备)来防御DDoS攻击的物理或虚拟服务器。其核心问题在于: 单点防御风险:依赖单一服务器硬扛攻击,若攻击流量超过防御阈值&am…...
入门-C编程基础部分:5、变量
飞书文档https://x509p6c8to.feishu.cn/wiki/PVnawQn5DiVhHhkMApqcDyDvnWg 变量的作用? 存储程序运行时,需要存储一些可能会变化的数据。 C 中每个变量都有特定的类型,类型决定了变量存储的大小和布局。 变量的名称可以由字母、数字和下划…...
Kafka深度解析与实战应用
Kafka深度解析与实战应用 作者:LedgerX技术团队 发布日期:2025年4月16日 引言 在当今数字时代,数据已成为企业的核心资产,而高效处理大规模数据流的能力则成为现代后端系统的关键挑战之一。Apache Kafka作为一个分布式流处理平台…...
数学教学通讯杂志数学教学通讯杂志社数学教学通讯编辑部2025年第6期目录
课程教材教法 “课程思政”视域下的高中数学教学探索与实践——以“函数概念的发展历程”为例 赵文博; 3-617 PBL教学模式下高中统计教学的探索与实践——以“随机抽样(第一课时)”为例 陈沛余; 7-10 “三新”背景下的高中数学教学困境与应对…...
【JavaEE初阶】多线程重点知识以及常考的面试题-多线程进阶(二)
本篇博客给大家带来的是多线程中synchronize的实现原理和JUC(java.util.concurrent) 常见类的相关知识点. 🐎文章专栏: JavaEE初阶 🚀若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的…...
Flutter PIP 插件 ---- iOS Video Call 自定义PIP WINDOW渲染内容
以下是一篇关于在 iOS 中实现画中画(PiP)功能的技术博客: iOS 画中画(PiP)功能实现指南 效果 简介 画中画(Picture in Picture, PiP)是一项允许用户在使用其他应用时继续观看视频内容的功能。本文将详细介绍如何在 iOS 应用中实现 PiP 功能,包括自定义内容渲染和…...
【正点原子STM32MP257连载】第四章 ATK-DLMP257B功能测试——4G模块ME3630测试
1)实验平台:正点原子ATK-DLMP257B开发板 2)浏览产品:https://www.alientek.com/Product_Details/135.html 3)全套实验源码手册视频下载:正点原子资料下载中心 文章目录 第四章 ATK-DLMP257B功能测试——4G模…...
高并发内存池(四):内存释放原理与实现
前言:经过前3期的攻坚,我们已完整实现了内存动态申请的核心模块。接下来将进入关键阶段——内存释放机制的理解与实现,这是构建完整 高并发内存池 的最后一块技术拼图。该模块完成后,项目主体架构将基本成型(达90%&…...
【正点原子STM32MP257连载】第四章 ATK-DLMP257B功能测试——EEPROM、SPI FLASH测试 #AT24C64 #W25Q128
1)实验平台:正点原子ATK-DLMP257B开发板 2)浏览产品:https://www.alientek.com/Product_Details/135.html 3)全套实验源码手册视频下载:正点原子资料下载中心 文章目录 第四章 ATK-DLMP257B功能测试——EEP…...
《突破控件限制:用Qt绘图API解锁高级界面定制能力》
一、基本概念 虽然 Qt 已经内置了很多的控件,但是不能保证现有控件就可以应对所有场景。很多时候我们需要更强的 “自定制” 能力。 Qt 提供了画图相关的 API,允许我们在窗口上绘制任意的图形形状来完成更复杂的界面设计 所谓的 “控件” 本质上也是通…...
MyBatis-Plus 中BaseMapper接口是如何加速微服务内部开发的?
假设我们有一个简单的微服务项目,需要对 User 实体进行基本的数据库操作。 场景一:使用原生 MyBatis 的开发流程 (作为对比) 定义实体类 (Entity): // package com.yourcompany.usermicroservice.entity; public class User {private Long id;private S…...
AIGC-十款数据分析类智能体完整指令直接用(DeepSeek,豆包,千问,Kimi,GPT)
Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列AIGC(GPT、DeepSeek、豆包、千问、Kimi)👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资…...
鸿蒙应用(医院陪诊系统)开发篇1·主页面的tabs布局
引言: 首先可在鸿蒙开发者官网找到DevEco Studio的安装教程。 安装好了之后,我们开始开发。 知识点: tabs布局,鸿蒙官方文档地址:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-contai…...
【大模型】DeepSeek + Coze 打造个人专属AI智能体使用详解
目录 一、前言 二、AI智能体介绍 2.1 什么是AI智能体 2.2 AI智能体核心能力 2.3 AI智能应用场景 三、coze 介绍 3.1 coze是什么 3.1.1 平台概述 3.1.2 平台适用人群 3.2 平台核心功能 3.3 coze可以做什么 3.4 为什么选择coze 四、coze 搭建AI智能体操作实践 4.1 搭…...
7.(vue3.x+vite)弹性布局(flex布局)
1:效果截图 2:代码实现 <template><span style="font-size: 20px">右边固定,左边自适应</span><div class=<...
Python基础总结(五)之字典
文章目录 一、字典的格式二、字典的操作2.1 增加项2.1.1 直接增加项2.1.1 formkeys方法 2.2 删除项2.2.1 clear()方法2.2.2 pop()方法 2.3 修改项2.3.1 直接修改2.3.2 update()方法 2.4 查找项2.4.1 get()方法2.4.2 直接查询2.4.3 items()方法2.4.4 keys()方法2.4.5 values()方…...
MCP简介:重构人机交互底层逻辑
在人工智能技术飞速发展的今天,大语言模型(LLM)的应用场景正不断拓展,但模型与外部系统之间的连接方式却成为制约其潜力发挥的关键瓶颈。为了解决这一难题,由AI领域顶尖公司Anthropic(Claude模型背后的开发…...
LangChain缓存嵌入技术完全指南:CacheBackedEmbedding原理与实践(附代码示例)
一、嵌入缓存技术背景与应用场景 1.1 为什么需要嵌入缓存? 算力消耗问题:现代嵌入模型(如text-embedding-3-small)单次推理需要约0.5-1秒/文本 资源浪费现状:实际业务中约30%-60%的文本存在重复计算 成本压力&#…...
国产DPU芯片+防火墙,能否引领网络安全新跨越?
近日,国内首款搭载国产DPU芯片的800Gbps下一代防火墙——中科网威NSFW - 12000正式发布,引发行业广泛关注。 国产DPU芯片与防火墙的结合,正在推动网络安全领域实现技术突破与体系升级。以下从技术特性、应用场景和产业价值三个维度分析其引领…...
Spark-SQL与Hive的连接及数据处理全解析
Spark-SQL与Hive的连接及数据处理全解析 在大数据处理领域,Spark-SQL和Hive都是重要的工具。今天就来聊聊Spark-SQL如何连接Hive以及相关的数据处理操作。 Spark-SQL连接Hive有多种方式。内嵌Hive虽然使用简单,直接就能用,但在实际生产中…...
ArcGIS Desktop使用入门(四)——9版本与10版本区别
系列文章目录 ArcGIS Desktop使用入门(一)软件初认识 ArcGIS Desktop使用入门(二)常用工具条——标准工具 ArcGIS Desktop使用入门(二)常用工具条——编辑器 ArcGIS Desktop使用入门(二&#x…...
使用 chromedriver 实现网络爬虫【手抄】
1、引用 selenium 包 <dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>4.29.0</version> </dependency> <dependency><groupId>org.seleniumhq.seleniu…...