Linux基础环境开发工具gcc/g++ make/Makefile
1.Linux编译器-gcc/g++使用
1. 预处理(进行宏替换)
预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
预处理指令是以#号开头的代码行。
实例: gcc –E hello.c –o hello.i
选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
选项“-o”是指目标文件,后面是编译好的文件名 “.i”文件为已经过预处理的C原始程序。
[wws@hcss-ecs-d531 ~]$ vim hello.c
[wws@hcss-ecs-d531 ~]$ gcc -E hello.c -o hello.i
[wws@hcss-ecs-d531 ~]$ cat hello.i

2.编译(生成汇编)
在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。
用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
实例: gcc –S hello.i –o hello.s
[wws@hcss-ecs-d531 ~]$ gcc -S hello.i -o hello.s
[wws@hcss-ecs-d531 ~]$ vim hello.s

3.汇编(生成机器可识别代码)
汇编阶段是把编译阶段生成的“.s”文件转成目标文件
在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了
实例: gcc –c hello.s –o hello.o
[wws@hcss-ecs-d531 ~]$ gcc -c hello.s -o hello.o
[wws@hcss-ecs-d531 ~]$ vim hello.o

4.连接(生成可执行文件或库文件)
在成功编译之后,就进入了链接阶段。
实例: gcc hello.o –o hello
生成可执行文件hello

函数库
我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?
最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用.
函数库一般分为静态库和动态库两种。
1.静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a”
2.动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”,如前面所述的 libc.so.6 就是动态库。gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件,如下所示。 gcchello.o –o hellogcc默认生成的二进制程序,是动态链接的,这点可以通过 file 命令验证。
gcc -o code_static code.s -static 用static选项链接静态库
yum install -y glibc-static 安装静态库C
yum install -y libstdc++-static C++静态库
2. Linux项目自动化构建工具-make/Makefile
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。
makefile使用
首先先创建两个文件 code.c makefile
-bash-4.2$ ll
total 8
-rw-r--r-- 1 wws wws 81 Aug 19 11:20 code.c
-rw-rw-r-- 1 wws wws 64 Aug 19 11:19 makefile


-bash-4.2$ ll
total 8
-rw-r--r-- 1 wws wws 81 Aug 19 11:20 code.c
-rw-rw-r-- 1 wws wws 64 Aug 19 11:19 makefile
-bash-4.2$ vim code.c
-bash-4.2$ vim makefile
//编译生成可执行程序code
-bash-4.2$ make
gcc -o code code.c
-bash-4.2$ ll
total 20
-rwxrwxr-x 1 wws wws 8360 Aug 19 11:26 code
-rw-r--r-- 1 wws wws 81 Aug 19 11:20 code.c
-rw-rw-r-- 1 wws wws 64 Aug 19 11:19 makefile
-bash-4.2$ ./code
hello Makefile!
//删除code
-bash-4.2$ make clean
rm -f code
-bash-4.2$ ll
total 8
-rw-r--r-- 1 wws wws 81 Aug 19 11:20 code.c
-rw-rw-r-- 1 wws wws 64 Aug 19 11:19 makefile
makefile原理

我们先了解一下各行代码作用
1.code(目标文件 要生成的文件):code.c (依赖文件列表 可以有多个文件)
gcc -o code code.c
依赖关系:
(Tab键)依赖方法
2. .PHONY(声明一个伪目标):clean(伪目标名称)
clean:(依赖文件列表为空)
rm -f code (要生成clean文件,就要执行它的依赖方法。但它的依赖方法不会生成文件,只是执行了删除文件的操作)
了解了这些我们看看几个问题
1.为什么make 就可以直接生成code文件呢?
(1)makefile文件会被make从上到下扫描,第一个目标名是缺省形成的。执行其他组的依赖关系和依赖方法,make+目标名。
把clean放第一个位置也可以make 默认执行。但不建议
2.PHONY:clean 有什么作用?
让目标文件的依赖方法每次都可执行。
-bash-4.2$ ll total 8 -rw-r--r-- 1 wws wws 81 Aug 19 11:20 code.c -rw-rw-r-- 1 wws wws 64 Aug 19 11:19 makefile -bash-4.2$ make gcc -o code code.c -bash-4.2$ make make: `code' is up to date. -bash-4.2$ make make: `code' is up to date. -bash-4.2$ make make: `code' is up to date.可以看到code:code.c 执行一次就不能执行了。
当我们给code加上.PHONY后,
-bash-4.2$ vim makefile -bash-4.2$ make gcc -o code code.c -bash-4.2$ make gcc -o code code.c -bash-4.2$ make clean rm -f code -bash-4.2$ make clean rm -f code -bash-4.2$ make clean rm -f code
3.可以看到code:code.c可以被多次执行了,但为什么clean: 也可以被多次执行呢?
让我们先修改一下makefile文件
首先我们要明白什么时候要重新编译文件,当然是文件内容被修改的时候。
根据对比code.c 和 code的Mtime(Modify)就可以判断文件内容有没有被修改。
.PHONY就是忽略Mtime时间的对比,来让目标文件的依赖方法每次都可执行。
stat 查看文信息
-bash-4.2$ ll total 20 -rwxrwxr-x 1 wws wws 8360 Aug 19 12:32 code -rw-r--r-- 1 wws wws 81 Aug 19 11:20 code.c -rw-rw-r-- 1 wws wws 63 Aug 19 12:32 makefile //stat 查看文件的详细信息 -bash-4.2$ stat code.cFile: ‘code.c’Size: 81 Blocks: 8 IO Block: 4096 regular file Device: fd01h/64769d Inode: 1703942 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1000/ wws) Gid: ( 1000/ wws) //Access 文件最近访问时 Access: 2024-08-19 11:23:32.023200919 +0800 //Modify 最新文件内容被修改的时间 Modify: 2024-08-19 11:20:19.100243259 +0800 //Change 最新文件属性被修改的时间 Change: 2024-08-19 11:20:19.102243300 +0800Birth: - -bash-4.2$ stat codeFile: ‘code’Size: 8360 Blocks: 24 IO Block: 4096 regular file Device: fd01h/64769d Inode: 1703940 Links: 1 Access: (0775/-rwxrwxr-x) Uid: ( 1000/ wws) Gid: ( 1000/ wws) Access: 2024-08-19 12:32:42.882419012 +0800 Modify: 2024-08-19 12:32:42.882419012 +0800 Change: 2024-08-19 12:32:42.882419012 +0800Birth: -让我们修改code.c文件的内容(因为文件属性也包含文件大小,内容改变,文件属性也会改变,所以Ctime和Mtime会一起改变)
-bash-4.2$ vim code.c -bash-4.2$ stat code.cFile: ‘code.c’Size: 180 Blocks: 8 IO Block: 4096 regular file Device: fd01h/64769d Inode: 1703950 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1000/ wws) Gid: ( 1000/ wws) Access: 2024-08-19 12:38:49.429946666 +0800 Modify: 2024-08-19 12:38:49.429946666 +0800 Change: 2024-08-19 12:38:49.431946707 +0800Birth: - -bash-4.2$ stat codeFile: ‘code’Size: 8360 Blocks: 24 IO Block: 4096 regular file Device: fd01h/64769d Inode: 1703940 Links: 1 Access: (0775/-rwxrwxr-x) Uid: ( 1000/ wws) Gid: ( 1000/ wws) Access: 2024-08-19 12:32:42.882419012 +0800 Modify: 2024-08-19 12:32:42.882419012 +0800 Change: 2024-08-19 12:32:42.882419012 +0800Birth: -可以看到code.c的Mtime的时间在code Mtime的后面,说明code的内容已经不是最新的,就可以make 重新编译。
-bash-4.2$ make gcc -o code code.c -bash-4.2$ stat codeFile: ‘code’Size: 8360 Blocks: 24 IO Block: 4096 regular file Device: fd01h/64769d Inode: 1703940 Links: 1 Access: (0775/-rwxrwxr-x) Uid: ( 1000/ wws) Gid: ( 1000/ wws) Access: 2024-08-19 12:41:24.546132682 +0800 Modify: 2024-08-19 12:41:24.546132682 +0800 Change: 2024-08-19 12:41:24.546132682 +0800Birth: -最后回到为什么clean:可以重复执行,就是因为clean:的依赖方法rm没有时间概念,所以可以重复执行。
4.我们想输出1111,但不想输出echo "1111"(echo 和字符间的空格不能省),怎么关闭命令回显呢?
可以用前加@关闭
-bash-4.2$ make echo "1111" 1111 echo "1111" 1111 echo "1111" 1111 echo "1111" 1111 gcc -o code code.c
-bash-4.2$ make 1111 1111 1111 1111 gcc -o code code.c
虽然看着只是用了一行代码就实现了对code.c的编译,其实展开来说这是一个递归实现的过程。
(2)make解析makefile时,如果code所依赖的code.o文件不存在,那么make会在当前文件中找目标为code.o文件的依赖性,以此类推,直到如找到再自下而上生成code(这有点像一个堆栈的过程)
-bash-4.2$ vim makefile -bash-4.2$ make gcc -E code.c -o code.i gcc -S code.i -o code.s gcc -c code.s -o code.o gcc code.o -o code -bash-4.2$ ll total 48 -rwxrwxr-x 1 wws wws 8360 Aug 20 10:37 code -rw-r--r-- 1 wws wws 180 Aug 19 12:59 code.c -rw-rw-r-- 1 wws wws 16978 Aug 20 10:37 code.i -rw-rw-r-- 1 wws wws 1680 Aug 20 10:37 code.o -rw-rw-r-- 1 wws wws 538 Aug 20 10:37 code.s -rw-rw-r-- 1 wws wws 205 Aug 20 10:37 makefile -bash-4.2$ ./code hello Makefile! hello Makefile! hello Makefile! hello Makefile! -bash-4.2$ make clean rm -f code.i code.s code.o code -bash-4.2$ ll total 8 -rw-r--r-- 1 wws wws 180 Aug 19 12:59 code.c -rw-rw-r-- 1 wws wws 205 Aug 20 10:37 makefile
makefile语法
1.% 通配符 $<
%.c 把当前目录中后缀.c文件放入依赖文件列表
$< :将依赖文件列表的文件一个一个交给gcc -c 配合 %.o生成同名的.o文件
2.定义变量名
我们可以给目标文件 依赖文件列表定义变量名。
$( ) 用来标记里面内容是变量名,不是文件。
3.$^ $@
$^:代表依赖文件列表
$@:代表目标文件
(3)make默认只生成一个可执行程序
-bash-4.2$ ll total 12 -rw-rw-r-- 1 wws wws 112 Aug 20 11:40 code.c -rw-rw-r-- 1 wws wws 181 Aug 20 12:13 makefile -rw-rw-r-- 1 wws wws 51 Aug 20 12:12 test.c -bash-4.2$ make gcc code.c -o code -bash-4.2$ ll total 24 -rwxrwxr-x 1 wws wws 8360 Aug 20 12:03 code -rw-rw-r-- 1 wws wws 112 Aug 20 11:40 code.c -rw-rw-r-- 1 wws wws 181 Aug 20 12:13 makefile -rw-rw-r-- 1 wws wws 51 Aug 20 12:12 test.c可以看到上面这种写法只生成了一个可执行程序,怎么才能生成两个呢?
我们可以用原理(2),让make默认生成all目标文件,生成all又需要实现依赖文件列表$(bin1) $(bin2) , 实现后all文件什么都不用做,就可以同时生成多个可执行程序。
-bash-4.2$ make gcc code.c -o code gcc test.c -o test -bash-4.2$ ll total 36 -rwxrwxr-x 1 wws wws 8360 Aug 20 12:13 code -rw-rw-r-- 1 wws wws 112 Aug 20 11:40 code.c -rw-rw-r-- 1 wws wws 181 Aug 20 12:13 makefile -rwxrwxr-x 1 wws wws 8360 Aug 20 12:13 test -rw-rw-r-- 1 wws wws 51 Aug 20 12:12 test.c
补充:回车/换行 缓冲区
首先回车和换行是同一个东西吗?
回车是把光标移动到一行的开头位置,换行是把光标从当前位置向下移一格,到下一行。平时我们写程序\n 就是先进行回车再进行换行。
这与缓冲区有什么关系呢?
这两段代码生成的程序有什么不同吗?
很明显,第二段代码输出hello后不会换行。但除此以外第一段代码hello是一开始就会输出,但第二段代码会先等2秒再输出。
编译器肯定是自上而下来读代码,printf("hello")后hello去哪了?
其实它是被存在缓冲区了,只不过\n可以立刻输出缓冲区的内容,立刻输出hello。第二段代码没有\n,只能等代码结束或者缓冲区满后输出。如果我们想让第二段代码缓冲区内容立刻输出,有什么办法吗?
可以加上fflush(stdout)可以立即将缓冲区内容刷新到输出设备。
注意下面代码输出 i 后进行\r回车操作,下一次输出时就会覆盖原位置内容。
但如果覆盖完后,后面还有上次留下的内容,就会连同新内容一起输出。
比如说上面输出10,经过回车操作,下次输出的9会覆盖1的位置,但后面0仍存在,导致后面一直有0。
-2%d 输出两位并左对齐进行解决
相关文章:
Linux基础环境开发工具gcc/g++ make/Makefile
1.Linux编译器-gcc/g使用 1. 预处理(进行宏替换) 预处理功能主要包括宏定义,文件包含,条件编译,去注释等。 预处理指令是以#号开头的代码行。 实例: gcc –E hello.c –o hello.i 选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。 选项“-o”是指目标…...
ES 模糊查询 wildcard 的替代方案探索
一、Wildcard 概述 Wildcard 是一种支持通配符的模糊检索方式。在 Elasticsearch 中,它使用星号 * 代表零个或多个字符,问号 ? 代表单个字符。 其使用方式多样,例如可以通过 {"wildcard": {"field_name": "value&…...
Linux安装MQTT 服务器(图文教程)
MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,专为低带宽和不稳定的网络环境设计,非常适合物联网(IoT)应用。 官网地址:https://www.emqx.com/ 一、版本选择 根据自己…...
【TCP】核心机制:延时应答、捎带应答和面向字节流
文章目录 延时应答捎带应答面向字节流粘包问题方案一:指定分隔符方案二:指定数据的长度 TCP 报头首部长度保留(6 位)选项序号确认序号 延时应答 尽可能降低可靠传输带来的性能影响 提升性能>让滑动窗口变大 如果我们立即返回 …...
题解:AT_abc352_e [ABC352E] Clique Connect
[题目通道]([ABC352E] Clique Connect - 洛谷) 鄙人今日写人生第一篇题解 希望管理大大通过 首先,我们先看题: 它说一共有n个点,m回操作。。。 每次操作 都有 一个Ki 和 Ci Ki代表有Ki个点,Ci代表每条边所赋的边权 一看就知道这是个最小生成树的板子…...
【代码随想录训练营第42期 Day32打卡 - 从零开始动态规划 - LeetCode 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯
目录 一、做题心得 二、动规五步走 三、题目与题解 题目一:509. 斐波那契数 题目链接 题解1:记忆性递归 题解2:动态规划 题目二:70. 爬楼梯 题目链接 题解:动态规划 题目三:746. 使用最小花费爬楼…...
源码构建LAMP
目录 一、安装Apache 二、安装Mysql 三、安装PHP 四、安装论坛 一、安装Apache 1.cd 到opt目录下面,将压缩包拉进Xhell 2.解压缩apr和httpd压缩包 tar xf apr-1.6.2.tar.gz tar xf apr-util-1.6.0.tar.gz tar xf httpd-2.4.29.tar.bz2 3.将apr-1.6.2 移动到ht…...
Java:封装树结构
实体类 public class DictTreeselectVO {private String value;private String label;/*** 节点*/private String parentId;private List<DictTreeselectVO> children new ArrayList<DictTreeselectVO>();public String getValue() {return value;}public void s…...
linux内核 pintrl子系统
1、什么是pinctrl子系统 在 Linux 内核中,pinctrl子系统是一个专门用于管理和控制 SoC引脚复用和配置的子系统。SoC 通常具有大量的引脚(pin),这些引脚可以被配置为不同的功能,比如 GPIO(通用输入输出&…...
网络通信要素
网络介绍 定义:将具有独立功能的多台计算机通过通信线路和通信设备连接起来,在网络管理软件及网络通信协议下,实现资源共享和信息传递的虚拟平台。 学习网络的目的: 能够编写基于网络通信的软件或程序,通常来说就是网…...
day03_作业
一、简答题 继承的格式与好处 格式:class A extends B 好处:1.可以实现代码的复用,将共性的代码向上抽取,抽取到父类中。需要使用这些属性和行为的类,通过继承即可使用。2.当需要添加新的功能时,可以通过…...
pyinstaller程序打包,资源嵌入exe
参考:https://blog.csdn.net/qq_48979387/article/details/132359366 一、参数说明 -F 最终打包为一个可执行文件。-w 取消Windows显示窗口-add-data ‘dll;dll’,将当前目录dll下的文件打包到可执行文件的dll中,最终会在解压文件的dll文件…...
如何使用 OCR 和 GPT-4o mini 轻松提取收据信息
利用 OCR 和强大的 GPT-4o 迷你模型对收据进行信息提取 利用 OCR 和强大的 GPT-4o 迷你模型对收据进行信息提取 欢迎来到雲闪世界。,我将向您展示如何从收据中提取信息,并提供收据的简单图像。首先,我们将利用 OCR 从收据中提取信息。然后&a…...
go 事务
事务处理 首先启动事务时一定要做错误判断建议在启动事务之后马上写defer方法在defer方法内对err进行判断,如果全局中有err!nil就回滚全局中err都为nil则提交事务在提交事务之后我们可以定义一个钩子函数afterCommit,来统一处理事务提交后的逻辑。 示例…...
C,数据结构,多进程线程,网络编程面试题总结
目录 1.指针数组和数组指针 2.结构体字节对齐 3.Tcp和Udp的区别 4.同步通信和异步通信的区别 5.多线程理解 6.大小端验证 7.互斥锁相关问题 8.共享内存特点 9.c中的指针 10.Gcc编译 11.Socket的了解 12.Ip地址和子网掩码如何决定网卡所在的网段 13.数据结构中栈与…...
【Cesium学习】着色器详解【待进一步总结】
在Cesium中,drawCommand 和 CustomShader 是与渲染管线和自定义渲染效果相关的两个重要概念,但它们各自有不同的作用和应用场景。下面我将分别详解这两个概念。 drawCommand drawCommand 是 Cesium 渲染引擎内部使用的一个概念,它代表了单个…...
【3】静态路由(Static routing)
目录 一、有类路由和无类路由 二、路由的基本知识 三、配置 路由的组成: 四、特殊——默认路由 五、优点和缺点 六、实验 数据通信是双向的,路由器不同的接口属于不同的广播域和冲突域 一、有类路由和无类路由 有类路由:有ABC类别之…...
阿里声音项目Qwen2-Audio的部署安装,在服务器Ubuntu22.04系统——点动科技
阿里声音项目Qwen2-Audio的部署安装,在服务器Ubuntu22.04系统——点动科技 一、ubuntu22.04基本环境配置1.1 更换清华Ubuntu镜像源1.2 更新包列表:2. 安装英伟达显卡驱动2.1 使用wget在命令行下载驱动包2.2 更新软件列表和安装必要软件、依赖2.2 卸载原有…...
RAG(检索增强生成)
RAG (Retrieval-Augmented Generation) 是一种自然语言处理的模型架构,主要用于生成性任务,如文本生成、对话系统等。RAG 将检索和生成两个任务结合起来,以提高生成结果的质量和相关性。 RAG 模型的主要思想是通过检索阶段获取相关的上下文信…...
AcWing848有向图的拓扑排序
拓扑排序的流程: 插入(a,b),表示a->b的关系,调用add(a,b),每次吧b的入度1,d[b]; 然后调用topsort,返回1表示存在拓扑序列,返回0表示不存在拓扑序列。判断是否存在拓扑…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...

















