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

【Linux】深入理解GCC/G++编译流程及库文件管理

目录

1.背景知识

2.gcc/g++如何完成编译

(1) 预处理(进行宏替换)

(2) 编译(生成汇编)

(3) 汇编(生成机器可识别代码)

(4) 链接(生成可执行文件或库文件)

(5) 总结

(6) 函数库

① 静态函数库

② 动态函数库

③ 动静态库比较

④ 验证动/静态链接

⑤ ldd - 程序的动态函数库解析

(7) gcc选项


1.背景知识

(1) 预处理(宏替换,条件编译)

(2) 编译(生成汇编)

(3) 汇编(生成机器可识别代码)

(4) 链接(生成可执行文件或库文件)

2.gcc/g++如何完成编译

格式 gcc [选项] 要编译的文件 [选项] [目标文件]

(1) 预处理(进行宏替换)

● 预处理功能个主要包括宏定义,文件包含,条件编译,去注释等。

● 预处理指令是以#号开头的代码行

● 【-E】选项的作用是,从现在开始进入程序编译,在预处理的时候就停下来

● 【-o】选项是指定目标文件,【.i】文件为已经预处理过的C原始程序

● 实例:gcc -E test.c -o test.i 将原始C语言代码预处理后的内容写到指定的 test.i 文件里

[zyt@iZ2vcf9wvlgcetfeub9f11Z ~]$ gcc -E test.c -o test.i
[zyt@iZ2vcf9wvlgcetfeub9f11Z ~]$ ll
-rw-rw-rw- 1 zyt zyt   270 Nov 18 09:16 test.c
-rw-rw-r-- 1 zyt zyt 16951 Nov 18 09:16 test.i

● 得到的【.i】文件还是C语言文件

● 预处理后的 【.i 】文件相比原来大很多

那是因为预处理器会将#include指令包含的头文件内容直接插入到源文件中(这些头文件都是被提前装在系统的/usr/include 目录下);预处理器宏定义展开;预处理器还会处理条件编译指令,如#ifdef#ifndef#endif等,这些指令可能会根据条件包含或排除某些代码段。

● 如何理解条件编译?

- 对软件进行专业度,收费情况进行区分(业务),使用条件编译,可以进行代码动态裁剪。

- 内核源代码也是用条件编译进行代码裁剪。

- 开发工具,应用软件也是用条件编译对功能代码动态裁剪。

(2) 编译(生成汇编)

● 在这个阶段中,gcc首先要检查代码的规范性、是否有语法错误等,以确定代码实际要做的工作,在检查无误后,gcc把代码翻译成汇编语言。

● 使用【-S】选项,gcc 会将C语言代码编译成汇编语言,并将结果输出到一个文件中,该文件的扩展名通常是【.s】

● 实例:gcc -S test.i -o test.s

[zyt@iZ2vcf9wvlgcetfeub9f11Z ~]$ gcc -S test.i -o test.s
[zyt@iZ2vcf9wvlgcetfeub9f11Z ~]$ ll
total 28
-rw-rw-rw- 1 zyt zyt   284 Nov 18 09:36 test.c
-rw-rw-r-- 1 zyt zyt 16945 Nov 18 09:37 test.i
-rw-rw-r-- 1 zyt zyt   589 Nov 18 09:39 test.s

我们打开.s文件看看,得到的是汇编文件

(3) 汇编(生成机器可识别代码)

● 汇编阶段是把编译阶段生成的【.s】文件转成目标文件

● 这个目标文件其实就是可重定位目标文件,此时已经是二进制文件了,但是无法直接执行,即使加上可执行权限。那是因为这个.o文件只是把我写的源文件编译成二进制了,而我们写的源文件中会包含很多的库方法,这些库方法还没有跟我们写的内容关联起来,所以是不可能运行的。(形象来说,就是我写的代码里用到了ptintf方法,但.o文件里没有print方法的实现,它的实践是在库里面实现的),win上形成的是XXX.obj。

● 使用【-c】选项就可以看到汇编代码转化为.o后缀的二进制目标代码了

●  实例:gcc -c test.s -o test.o

[zyt@iZ2vcf9wvlgcetfeub9f11Z ~]$ gcc -c test.s -o test.o
[zyt@iZ2vcf9wvlgcetfeub9f11Z ~]$ ll
total 32
-rw-rw-rw- 1 zyt zyt   284 Nov 18 09:36 test.c
-rw-rw-r-- 1 zyt zyt 16945 Nov 18 09:37 test.i
-rw-rw-r-- 1 zyt zyt  1672 Nov 18 09:57 test.o
-rw-rw-r-- 1 zyt zyt   589 Nov 18 09:39 test.s

vim打开【.o】文件后: 

(4) 链接(生成可执行文件或库文件)

● gcc 本身是编译C语言的,会在系统里找出可执行程序依赖的库

● 链接器它将一个或多个.o文件与所需的库文件链接起来,解决所有的外部引用,并生成一个单一的可执行文件。

● 实例: gcc test.o -o test

[zyt@iZ2vcf9wvlgcetfeub9f11Z ~]$ gcc test.o -o test
[zyt@iZ2vcf9wvlgcetfeub9f11Z ~]$ ll
total 44
-rwxrwxr-x 1 zyt zyt  8496 Nov 18 10:13 test
-rw-rw-rw- 1 zyt zyt   284 Nov 18 09:36 test.c
-rw-rw-r-- 1 zyt zyt 16945 Nov 18 09:37 test.i
-rw-rw-r-- 1 zyt zyt  1672 Nov 18 09:57 test.o
-rw-rw-r-- 1 zyt zyt   589 Nov 18 09:39 test.s
# 运行一下
[zyt@iZ2vcf9wvlgcetfeub9f11Z ~]$ ./test
Hello!,100
Hello!
hello N!

(5) 总结

我们上面将gcc完成编译的整个过程通过【-E】【-S】【-c】选项显性的展示成后缀为【.i】【.s】【.o】的临时文件,但是正常编译时,这些后缀文件不会以文件的形式写到磁盘上,而是在gcc编译器启动之后将这些编译形成的临时文件全都写到编译器内部,在内存中就处理好了,最终直接给我们呈现一个可执行文件。

选项记忆技巧:将编译带选项时联想到键盘上的ESC键,即-E-S-c,依次生成的文件可以联想到.iso镜像文件,即.i.s.o

(6) 函数库

● 我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么是在哪里实现的?

● 其实是:系统把这些函数实现都放到名为【libc.so.6】的库文件中了,在没有特别指定时,gcc会到系统默认的搜索路径【/usr/lib】下进行查找,也就是链接到【libc.so.6】库函数中去就能实现函数“printf”了,而这也就是链接的作用。

● 函数库一般分为两大类,分别是静态(static)与动态(dynamic)函数库。

● 什么叫做动静态链接?如何理解?

① 静态函数库

● 扩展名:libxxx.a

● 编译操作

编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大。但在运行时也就不再需要库文件了,也就是编译成功的可执行文件可以独立运行

● 升级难易程度

虽然执行文件可以独立执行,但因为函数库是直接整合到执行文件中的,所以若函数库升级时,整个执行文件必须要重新编译才能将新版的函数库整合到程序中。也就是说,在升级方面只要函数库升级了,所有使用此函数库的程序都要重新编译。

② 动态函数库

● 扩展名:libxxx.so

● 编译操作

与静态函数被整个整合到程序中不同的是,动态函数库在编译时,在程序里面只有一个【指针】的位置而已(地址上产生关联,让我的程序能找到库里面方法的地址)。也就是说,动态函数库的内容并没有被整合到执行文件当中,而是当执行文件要使用到函数库的功能时,程序才会去读取函数库来使用(跳转到库里面执行,完了再返回)。由于执行文件当中仅具有指向动态函数库所在的指针而已,并不包含函数库的内容,所以它的文件会比较小。

● 独立执行状态

这类函数库所编译出的程序不能被独立执行,因为当我们使用到函数库的功能时,程序才会去读取函数,所以函数库文件【必须要存在】才行,而且,函数库的【所在目录也不能改变】,因为我们的可执行文件里面仅有【指针】,亦即当要使用该动态函数库时,程序会主动去某个路径下读取,所以动态函数库可不能随意移动或删除,会影响很多依赖的程序软件。

● 升级难易程度

当函数库升级后,执行文件根本不需要进行重新编译的操作,因为执行文件会直接指向新的函数库文件(前提是函数库新旧版本的文件名相同)。

● gcc默认生成的二进制程序,是动态链接的,这点可以通过file命令验证。

● 动态库的本质:使语言层面的公共代码在内存中只出现一份。

在执行gcc动态链接形成可执行文件时,这个动态库会跟该文件一样被加载到内存里,后续再用gcc编译其他文件时要是也用到这个库,就不用在加载了,直接跳转到内存中的库即可。

③ 动静态库比较

1、动态库形成的可执行程序体积一定很小

2、可执行程序对静态库的依赖度很小,但动态库不能缺失

3、程序运行需要加载到内存,静态链接时,会在内存中出现大量的重复代码,动态链接时,比较节省内存和磁盘资源。

④ 验证动/静态链接

1、验证gcc默认是动态链接

test.c文件里面简单写入:

  1 #include<stdio.h>2 int main()3 {4     printf("Hello!\n");5     return 0;6 }

用gcc完成编译后用 ldd,file 查看该文件详细信息: 得到的 test 是64位、可执行、动态链接的文件 。

链接的动态库就是libc-2.17.so(这是系统里本来就预装的) 

[zyt@iZ2vcf9wvlgcetfeub9f11Z ~]$ ll /usr/lib64/libc.so*
-rw-r--r-- 1 root root 253 Jul  3  2019 /usr/lib64/libc.so
lrwxrwxrwx 1 root root  12 Jul 11  2019 /usr/lib64/libc.so.6 -> libc-2.17.so

 2、如果我们想要用静态库连接

前提:系统里就必须要存在C静态库,但我们指明【-satic】执行后发现系统里没有C静态库。

[zyt@iZ2vcf9wvlgcetfeub9f11Z ~]$ gcc test.c -o test -static
/usr/bin/ld: cannot find -lc
collect2: error: ld returned 1 exit status

安装glic静态库用sudo yum install -y glibc-static 系统会默认把它装到【/usr/lib64/】下,文件名就叫做libc.a。(g++使用也与之类似【sudo yum install libstdc++-static】

[zyt@iZ2vcf9wvlgcetfeub9f11Z ~]$ ll /usr/lib64/libc.a
-rw-r--r-- 1 root root 5105516 Jun  4 23:05 /usr/lib64/libc.a

然后再进行gcc静态编译,发现这个可执行文件会特别的大。比之前动态链接生成的可执行文件大了100倍。用ldd、file观察也显示的是静态链接。

[zyt@iZ2vcf9wvlgcetfeub9f11Z ~]$ gcc test.c -o test -static
[zyt@iZ2vcf9wvlgcetfeub9f11Z ~]$ ll
total 848
-rwxrwxr-x 1 zyt zyt 861336 Nov 18 15:43 test
-rw-rw-rw- 1 zyt zyt     71 Nov 18 15:21 test.c

⑤ ldd - 程序的动态函数库解析

我们如何判断某个可执行的二进制文件含有什么动态函数库?

ldd [-vdr] [filename]

-v:列出所有内容信息

-d:重新将数据有遗失的链接点显示出来

-r:将ELF有关的的错误内容显示出来(某些特定信息,比如ELF头信息、节信息等。这些信息对于调试和分析ELF文件非常有用,尤其是在遇到与ELF文件格式相关的问题时

用ldd查看一下我们刚刚实现的可执行文件test,我们观察到【libc.so.6】就是我们使用的动态链接库,【libc.so.6】是C标准库实现的,是大多数 Linux 程序运行时所依赖的核心库之一。

[zyt@iZ2vcf9wvlgcetfeub9f11Z ~]$ ldd -v testlinux-vdso.so.1 =>  (0x00007ffea694a000)libc.so.6 => /lib64/libc.so.6 (0x00007fefa2f56000)/lib64/ld-linux-x86-64.so.2 (0x00007fefa3323000)Version information:./test:libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6/lib64/libc.so.6:ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2

(7) gcc选项

● -D:进行命令行级别的宏定义

这个选项后面跟着你想要定义的宏名称,如果你还想要为宏指定一个值,如果宏没有值,GCC 会定义它为 1。

test.c文件里面的内容: 

  1 #include<stdio.h>2 #define M 1003 4 int main()5 {6     printf("Hello!%d\n",M);7     //printf("Hello!");8     //printf("Hello!");    9     printf("Hello!\n");10 11     #ifdef N12         printf("hello N!\n");13     #else14         printf("hello no N!\n");15     #endif16         return 0;17 }

我们命令行新定义的一个宏N(不能与源代码中定义的宏相同) 

[zyt@iZ2vcf9wvlgcetfeub9f11Z ~]$ gcc test.c -o test -DN=10
[zyt@iZ2vcf9wvlgcetfeub9f11Z ~]$ ./test
Hello!100
Hello!
hello N!
● -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
● -S  编译到汇编语言不进行汇编和链接
● -c  编译到目标代码
● -o 文件输出到 文件
● -static 此选项对生成的文件采用静态链接
● -g 生成调试信息。GNU 调试器可利用该信息。
● -shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.
● -O0
● -O1
● -O2
● -O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
● -w  不生成任何警告信息。
● -Wall 生成所有警告信息。

相关文章:

【Linux】深入理解GCC/G++编译流程及库文件管理

目录 1.背景知识 2.gcc/g如何完成编译 (1) 预处理&#xff08;进行宏替换&#xff09; (2) 编译&#xff08;生成汇编&#xff09; (3) 汇编&#xff08;生成机器可识别代码&#xff09; (4) 链接&#xff08;生成可执行文件或库文件&#xff09; (5) 总结 (6) 函数库 …...

分布式 窗口算法 总结

前言 相关系列 《分布式 & 目录》《分布式 & 窗口算法 & 总结》《分布式 & 窗口算法 & 问题》 参考文献 《【算法】令牌桶算法》 固定窗口算法 简介 固定窗口算法是最简单的流量控制算法。固定窗口算法的核心原理是将系统的生命周期划分为一个个…...

多分类交叉熵与稀疏分类交叉熵

总结: 标签为 One-hot 编码的多分类问题,用分类交叉熵对于标签为整数的多分类问题,用稀疏分类交叉熵稀疏分类交叉熵内部会将整数标签转换为 One-hot 编码,而如果标签已经是 One-hot 编码的形式,再使用稀疏分类交叉熵就会多此一举。 算例 假设我们有三个类别:A、B 和 C。…...

ElasticSearch 简介

一、什么是 ElastcSearch&#xff1f; ElasticSearch 是基于 Lucene 的 Restful 的分布式实时全文搜索引擎。 1.1 ElasticSearh 的基本术语概念 index 索引 索引类似与 mysql 中的数据库&#xff0c;ES 中的索引是存储数据的地方&#xff0c;包含了一堆有相似结构的文档数据…...

一些浅显易懂的IP小定义

IP归属地&#xff08;也叫IP地址&#xff0c;IP属地&#xff09; 互联网协议地址&#xff0c;每个设备上的唯一的网络身份证明。用于确保网络数据能够精准传送到你的设备上。 基于IP数据云全球IP归属地解析&#xff0c;示例Python代码 curl -X POST https://route.showapi.co…...

#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍02-基于错误消息的SQL注入(Error-Based SQL Injection)

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…...

C# 探险之旅:第三十六节 - 类型class之密封类Sealed Classes

嗨&#xff0c;探险家们&#xff01;欢迎再次搭乘我们的C#魔法列车&#xff0c;今天我们要去一个神秘又有点“傲娇”的地方——密封类&#xff08;Sealed Classes&#xff09;领地。系好安全带&#xff0c;咱们要深入“密封”的奇妙世界啦&#xff01; 什么是密封类&#xff1…...

Error in v-on handler: “TypeError: handler.apply is not a function“

报错截图 原因 原来是我在.vue单文件中 data里面的属性和methods里面的方法重名了 解决 方面重新命名了一下和data里面的属性值不一样就可以了。...

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(五)

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(五) 你好,我是拉依达。 感谢所有阅读关注我的同学支持,目前博客累计阅读 27w,关注1.5w人。其中博客《最全Linux驱动开发全流程详细解析(持续更新)-CSDN博客》已经是 Linux驱动 相关内容搜索的推荐首位,感谢大家支持。 《拉…...

《B+树的原理与实践:探索高效数据存储与检索》

一、B树的基本原理 B树的定义 B树是一种自平衡的树结构&#xff0c;它是由B树衍生而来的。B树的特点是所有的数据记录都存储在叶子节点上&#xff0c;而叶子节点本身按照关键字的大小顺序相连&#xff0c;形成一个有序链表。 B树的结构 B树的结构包括以下几个部分&#xff1…...

Android无障碍服务监听实现自动点击按钮

原理&#xff1a; 通过监听窗口改变事件&#xff0c;监听目标应用&#xff0c;通过视图ID&#xff08;或文本、或描述、或其他如坐标之类的&#xff09;找到目标视图&#xff0c;使用无障碍动作点击方法点击它 无障碍服务实现&#xff1a; 1、写一个自己的无障碍服务继承Acc…...

Jenkins 启动 程序 退出后 被杀死问题

参考 Spawning Processes From Build (jenkins.io) 解决jenkins脚本启动项目后进程被杀死_jenkins杀进程-CSDN博客...

前端样式练手:阴阳图+时钟的组合

开篇 今天的小作品是突然脑子灵光一闪写出来的&#xff0c;代码不多&#xff0c;就不过多赘述了。 代码实现 <template><div class"clock-container"><!-- 八卦图 --><!-- <div class"bagua"><divv-for"(trigram, ind…...

开源分布式系统追踪-03-CNCF jaeger-02-快速开始

分布式跟踪系列 CAT cat monitor 分布式监控 CAT-是什么&#xff1f; cat monitor-02-分布式监控 CAT埋点 cat monitor-03-深度剖析开源分布式监控CAT cat monitor-04-cat 服务端部署实战 cat monitor-05-cat 客户端集成实战 cat monitor-06-cat 消息存储 skywalking …...

医学图像分割数据集脑肿瘤分割数据集labelme格式715张1类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数)&#xff1a;715 标注数量(json文件个数)&#xff1a;715 标注类别数&#xff1a;1 标注类别名称:["tumor"] 每个类别标注的框数&#xf…...

2024.12.11-13——攻防世界unserialize3

知识点&#xff1a;PHP中的序列化和反序列化 一、序列化和反序列化 1.序列化(serialize) 将对象的状态信息转换为可以存储或传输的形式的过程&#xff0c;简单来说&#xff0c;就是将状态信息保存为字符串。为了解决不同机器之间传输复杂数据类型的一种机制 2.反序列化(uns…...

Docker的镜像

目录 1. 镜像是什么&#xff1f;&#xff1f;2. 镜像命令详解2.1 镜像命令清单2.2 docker rmi命令2.3 docker save命令2.4 docker load命令2.5 docker history命令2.6 docker import命令2.7 docker image prune命令2.8 docker build命令 3. 镜像的操作4. 离线迁移镜像5. 镜像存…...

深度学习训练参数之学习率介绍

学习率 1. 什么是学习率 学习率是训练神经网络的重要超参数之一&#xff0c;它代表在每一次迭代中梯度向损失函数最优解移动的步长&#xff0c;通常用 η \eta η 表示。它的大小决定网络学习速度的快慢。在网络训练过程中&#xff0c;模型通过样本数据给出预测值&#xff0…...

Vue技术中参数传递:Props与事件的实践指南

在Vue.js中&#xff0c;组件间的参数传递是构建动态和交互式应用的核心。本文将深入探讨如何通过Props和事件&#xff08;$emit&#xff09;在Vue组件间进行参数传递&#xff0c;并提供代码示例。 Props传递数据 Props是Vue中组件间传递数据的一种方式&#xff0c;它允许父组…...

刷题日志【4】

目录 1、猜数字大小 1、猜数字大小 题意有点抽象&#xff0c;我大概讲一下&#xff0c;就是在1——n里面会有一个目标数&#xff0c;我们通过猜数字的方式逼近这个数字&#xff0c;直到解出这个数&#xff0c;之前我们是用二分法求最快达到求解的问题&#xff0c;这道题多了每…...

IDEA对windows下的docker里面的Weblogic 进行远程调试(漏洞环境搭建)部署Vulhub漏洞环境

参考书籍&#xff1a;《Java代码审计》入门篇 人民邮电出版社 话不多说&#xff0c;上教程&#xff01;&#xff01;&#xff01; 环境很重要&#xff01;&#xff01;&#xff01;&#xff01; 其他的环境不保证对 本机环境&#xff1a;java jdk 8 下载 选择 下载就行 然后 …...

【深度学习】Java DL4J基于多层感知机(MLP)构建公共交通优化模型

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程,高并发设计,Springboot和微服务,熟悉Linux,ESXI虚拟化以及云原生Docker和K8s,热衷于探…...

医学分割数据集肾结石分割数据集labelme格式359张1类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数)&#xff1a;359 标注数量(json文件个数)&#xff1a;359 标注类别数&#xff1a;1 标注类别名称:["kidney stone"] 每个类别标注的框数&…...

Ansible自动化运维(五) 运维实战

Ansible自动化运维这部分我将会分为五个部分来为大家讲解 &#xff08;一&#xff09;介绍、无密钥登录、安装部署、设置主机清单 &#xff08;二&#xff09;Ansible 中的 ad-hoc 模式 模块详解&#xff08;15&#xff09;个 &#xff08;三&#xff09;Playbook 模式详解 …...

ReactPress最佳实践—搭建导航网站实战

Github项目地址&#xff1a;https://github.com/fecommunity/easy-blog 欢迎Star。 近期&#xff0c;阮一峰在科技爱好者周刊第 325 期中推荐了一款开源工具——ReactPress&#xff0c;ReactPress一个基于 Next.js 的博客和 CMS 系统&#xff0c;可查看 demo站点。&#xff08;…...

Dual-Write Problem 双写问题(微服务)

原文链接https://www.confluent.io/blog/dual-write-problem/ 双写问题发生于当两个外部系统必须以原子的方式更新时。 问题 说有人到银行存了一笔钱&#xff0c;触发 DepositFunds 命令&#xff0c;DepositFunds 命令被发送到Account microservice。 Account microservice需…...

文件转曲,限制PDF文件编辑的最佳方案!

随着数字化进程的推进&#xff0c;PDF文件凭借其多样化的功能和优越的兼容性已经被广泛使用&#xff0c;成为了现代文档交流和存储的重要工具&#xff0c;满足了不同用户和行业的需求。 虽然PDF格式文件的功能很多&#xff0c;常见的比如阅读、编辑、加密、转换、还可用于印刷…...

call,apply,bind 深入

显示绑定 我们通常会碰见丢失绑定的情况&#xff0c;例如系统函数setTimeOut function foo() { console.log( this.a ); } var obj { a: 2, foo: foo }; var a "oops, global"; // a是全局对象的属性 setTimeout( obj.foo, 100 ); // "oops, globalca…...

监测预警智能分析中心建设项目方案

随着科技的不断进步&#xff0c;地理信息与遥感技术在国家治理、环境保护、灾害预警等领域发挥着越来越重要的作用。监测预警智能分析中心的建设&#xff0c;旨在通过集成先进的遥感技术、地理信息系统&#xff08;GIS&#xff09;、大数据分析和人工智能&#xff08;AI&#x…...

redis stream轻量级消息队列

redis 5.0 之后新推出了stream数据结构&#xff0c;可以实现一个轻量级的消息队列&#xff0c;下面通过自定义注解和springboot使用一下redis stream 1.自定义注解 Target(ElementType.METHOD) Retention(value RetentionPolicy.RUNTIME) public interface MsgStreamListener …...

ORACLE SQL思路: 多行数据有相同字段就合并成一条数据 分页展示

数据 分数表&#xff1a; 学号&#xff0c;科目名&#xff08;A,B,C&#xff09;&#xff0c;分数 需求 分页列表展示&#xff0c; 如果一个学号的科目有相同的分数&#xff0c; 合并成一条数据&#xff0c;用 拼接 科目名 ORACLE SQL 实现 SELECT Z.*, SUBSTR(DECODE(f…...

UE5制作倒计时功能

设置画布和文本 文本绑定 格式化时间 转到事件图表&#xff0c;计算时间&#xff0c;时间结束后面的事件可以按自己需求写 进入关卡蓝图&#xff0c;添加倒计时UI...

若依-帝可得app后端

视频地址 https://www.bilibili.com/video/BV1pf421B71v?t=510.1 APP后端技术栈 架构解析 验证码功能 开发环境使用改的是固定的验证码 12345正式环境使用的是 阿里云的短信方案@Override public void sendSms(String mobile) {// String code = RandomUtil.randomNumbers(5);…...

Vulnstack红日安全内网域渗透靶场2实战攻略

一&#xff1a;环境搭建 新增的网卡VMnet2&#xff0c;ip调成10段。 PC配置如下&#xff1a; DC在该环境中充当是域控。DC配置如下 &#xff1a; WEB配置&#xff1a;需要两块网卡&#xff0c;相当于网关服务器。 作者把外网网段都写成了192.168.111.1/24&#xff0c;我们可以…...

苹果电脑可以安装windows操作系统吗?Mac OS X/OS X/macOS傻傻分不清?macOS系统的Java支持?什么是macOS的五大API法王?

苹果电脑可以安装windows操作系统吗? 先抛开虚拟机安装&#xff0c;苹果电脑可以安装Windows操作系统。苹果公司提供了一个名为Boot Camp的软件&#xff0c;它允许用户在Mac电脑上安装Windows操作系统。通过Boot Camp&#xff0c;用户可以在启动电脑时选择是要进入macOS还是Wi…...

benchANT (Time Series: Devops) 榜单数据解读

近日&#xff0c;国际权威数据库性能测试榜单 benchANT 更新了 Time Series: Devops&#xff08;时序数据库&#xff09;场景排名&#xff0c;KaiwuDB 数据库在 xsmall 和 small 两类规格下的时序数据写入吞吐、查询吞吐、查询延迟、成本效益等多项指标刷新榜单原有数据纪录 &a…...

React useEffect使用

useEffect依赖 是reac hook的函数 useEffect作用&#xff1a;不是由事件引起&#xff0c;而是由渲染本身引起的操作&#xff0c;比如发起请求&#xff0c;更改DOM 不发生任何的用户事件&#xff0c;组件渲染完毕之后就需要和服务器要数据&#xff0c;整个过程中属于‘只需要…...

Python随机抽取Excel数据并在处理后整合为一个文件

本文介绍基于Python语言&#xff0c;针对一个文件夹下大量的Excel表格文件&#xff0c;基于其中每一个文件&#xff0c;随机从其中选取一部分数据&#xff0c;并将全部文件中随机获取的数据合并为一个新的Excel表格文件的方法。 首先&#xff0c;我们来明确一下本文的具体需求。…...

Unix 和 Windows 的有趣比较

Unix 和 Windows NT 比较 来源于这两本书&#xff0c;把两本书对照来读&#xff0c;发现很多有意思的地方&#xff1a; 《Unix 传奇》 https://book.douban.com/subject/35292726/ 《观止 微软创建NT和未来的夺命狂奔 》 Showstopper!: The Breakneck Race to Create Windows…...

解决Android Studio Unexpected tokens (use ; to separate expressions on the same line)

[TOC](Unexpected tokens (use ; to separate expressions on the same line)) 问题描述&#xff1a;Unexpected tokens (use ; to separate expressions on the same line) 原因&#xff1a;Android Studio 更新到最新的版本之后&#xff0c;gradle工程目录结构发生改变 问…...

【Office】Office实现shift+鼠标滚轮左右滑动

Office实现shift鼠标滚轮左右滑动 windows系统安装office之后发现&#xff0c;使用shift鼠标滚轮不能够实现左右滑动&#xff0c;我记得以前的office好像是可以的&#xff0c;然后在网上找了一下&#xff0c;找到了一个插件可以实现这个功能 OfficeScroll插件 下载地址&…...

1.C语言 typedef的使用方法

描述作用 1.typedef主要通途给类型起一个别名&#xff0c;比如给int类型取个中文名字 zhengxingint。 2.typedef可以简化struct关键字 3.typedef可以区分数据类型 4.typedef提高代码的平台可移植性。 举例 取别名 #include "stdio.h" #include "string.h&q…...

人工智能原理实验四:智能算法与机器学习

一、实验目的 本实验课程是计算机、智能、物联网等专业学生的一门专业课程&#xff0c;通过实验&#xff0c;帮助学生更好地掌握人工智能相关概念、技术、原理、应用等&#xff1b;通过实验提高学生编写实验报告、总结实验结果的能力&#xff1b;使学生对智能程序、智能算法等…...

redis 架构详解

Redis架构详解可以从以下几个方面进行阐述&#xff1a; 一、部署架构 Redis有多种部署架构&#xff0c;适用于不同的应用场景和需求&#xff0c;主要包括以下几种&#xff1a; 单机模式&#xff08;Standalone Mode&#xff09; 特点&#xff1a;部署简单&#xff0c;配置方便…...

shell脚本自动发布Java应用

单体项目或定制化小应用&#xff0c;频繁发布会有些麻烦&#xff0c;用脚本实现git提交完代码自动发布&#xff0c;并完成jar包备份 1.前提条件&#xff1a;linux安装了JDK、Maven、Git 安装参考链接&#xff1a; jdk安装 https://blog.csdn.net/weixin_44904239/article/de…...

微信小程序调用腾讯地图-并解读API文档 JavaScript SDK和 WebService API

搜索&#xff1a;腾讯位置服务 找到API文档&#xff1a; 入门中第一步&#xff1a;申请开发者密钥key 前往控制台&#xff1a; 创建应用并获取key: 设置key的时候&#xff0c;还需要小程序的APPID。所以要前往微信公众平台中获取小程序的APPID&#xff1a; 限制要求&#xff1a…...

go build command

文章目录 1.简介2.格式3.选项4.示例5.小结参考文献 1.简介 go build 是 Go 语言工具链中的一个命令&#xff0c;它用于编译 Go 源代码并生成可执行文件。 2.格式 go build [-o output] [build flags] [packages]可选的 -o 选项强制 build 将生成的可执行文件或对象写入指定的…...

前端面试题目 (Node.JS-Express框架)[二]

在 Express 中如何使用 Passport.js 进行身份认证? Passport.js 是一个 Node.js 的身份验证中间件&#xff0c;它可以很容易地与 Express 集成。下面是一个简单的示例&#xff0c;展示了如何使用 Passport.js 进行基本的身份认证。 安装依赖 npm install express passport …...

云和恩墨 zCloud 与华为云 GaussDB 完成兼容性互认证

近日&#xff0c;云和恩墨&#xff08;北京&#xff09;信息技术有限公司&#xff08;以下简称&#xff1a;云和恩墨&#xff09;的多元数据库智能管理平台 zCloud 与华为云计算技术有限公司&#xff08;以下简称&#xff1a;华为云&#xff09;的 GaussDB 数据库完成了兼容性互…...

go-zero(十三)使用MapReduce并发

go zero 使用MapReduce并发 一、MapReduce 介绍 MapReduce 是一种用于并行计算的编程模型&#xff0c;特别适合在大规模数据处理场景中简化逻辑代码。 官方文档&#xff1a; https://go-zero.dev/docs/components/mr 1. MapReduce 的核心概念 在 MapReduce 中&#xff0c;主…...