Linux工具学习之【gcc/g++】
📘前言
书接上文,我们已经学习了 Linux 中的编辑器 vim 的相关使用方法,现在已经能直接在 Linux 中编写C/C++代码,有了代码之后就要尝试去编译并运行它,此时就可以学习一下 Linux 中的编译器 gcc/g++ 了,我们一般使用 gcc 编译C语言,g++ 编译C++(当然 g++ 也可编译C语言),这两个编译器我们可以当作一个来学习,因为它们的命令选项都是通用的,只是编译对象不同。除了编译器相关介绍外,本文还会库、自动化构建工具、提权等知识,一起来看看吧
📘正文
📖gcc/g++ 命令
在接下来的学习中,我们以 gcc 为例,因为两者选项都是通用的,所以也就相当于间接学习了 g++ ,这个编译器上手还是很简单的,选项也不是很多
注意: 如果命令失效,很有可能是没有下载 gcc/g++ ,需要自行下载安装 gcc 与 g++
📃-o 目标文件
gcc 源文件 默认会将代码编译链接并生成可执行文件 a.out ,当然前提是代码没问题,所以这样看来编译一个文件还是很简单的
$ gcc 源文件 //直接编译源文件,生成默认可执行文件为 a.out
可能有的人不想让它生成默认的 a.out
,想生成为指定文件,没有问题,直接通过 -o
选项就能实现
注意:-o
选项后面必须紧跟生成的目标文件,这个选项可以放在源文件后面,也可以放在前面
$ gcc test.c -o OK //编译生成文件为 OK
$ gcc -o OK test.c //这种写法也是可以的
在我们使用 gcc/g++
时,都可以通过 -o
选项生成指定文件
📃-E 预处理
在C语言学习阶段,我们学习了源文件变成可执行文件的过程,即预处理-编译-汇编-链接,当时因为没有学习Linux,没法很好的展示各个环节的现象,今天可以来详细看看
首先是第一步:预处理,又称预编译
会进行头文件展开、删除注释、替换宏、执行条件编译等操作
目的是生成一个纯粹的C代码程序
经过预处理后的文件后缀为 .i
我们可以直接通过 gcc 中的 -E 命令,使编译器在执行完预处理后停下来,配合 -o 生成指定文件,这样我们就可以观察到上面所提到的这些现象了。
$ gcc -E test.c -o test.i //预处理后的文件后缀为 .i 此时仍然是C语言
📃-S 编译
下面进入第二个步骤:编译
进行语法分析、词法分析、语义分析、符号汇总等,然后将合法的代码转为汇编代码
编译目的是生成汇编代码
编译后生成的文件后缀为 .s
编译阶段比较重要的一步就是符号汇总,它会各种符号汇总起来,方便后续符号表的形成,符号表用于各种函数间的相互调用
我们可以通过 -S 选项,使 gcc 在执行完编译阶段后就停下来,配合 -o 生成文件 test.s
$ gcc -S test.c -o test.s //可以直接从 test.c 开始执行,也可以从上一步中的 test.i 执行
📃-c 汇编
接下来进入第三步:汇编
主要任务是将汇编代码转为二进制,并生成符号表
二进制文件的格式是 elf ,此时 vim 查看为乱码
生成的文件后缀为 .o
因为计算机只能看懂二进制,所以将代码转为二进制是必须进行的操作,除此之外,还有一个重要步骤:生成符号表
关于符号表
这个东西相当于函数独一无二的地址,在Linux 中,C语言的符号表比较简单,通常是 _函数名,比如 _Add ;C++更详细一些,通常为 _Z函数名长度+函数名+参数1+参数2 ,比如常见的 Add 函数,生成的符号表为 _Z3Addii ,这里的参数是两个整型,这也是C++支持重载,而C语言不支持重载的根本原因,毕竟C语言中两个重名的函数生成的符号表是完全一样的,区分不了
可以通过 -c 选项使 gcc 在执行完汇编阶段后就停下来,指定保存文件为 test.o
查看生成的 test.o 文件,可以用 readelf 这个工具,缺失的可以去下载
$ gcc -c test.c -o test.o //从源文件重新开始编译,生成 test.o 二进制文件
$ gcc -c test.s -o test.o //从上一步中生成的 test.s 文件开始编译,两者效果是一样的//关于查看 elf 格式的文件
$ readelf -a test.o //可以通过软件,观察到符号表等信息
📃gcc 链接
下面是最后一步:链接
进行合并段表、将符号表进行合并和重定位等
将程序运行所需的各种函数链接起来,包括与库函数的链接,Linux 中一般是动态链接,链接后生成可执行文件,此时的文件也是 elf 的格式
gcc 默认生成的可执行文件为 a.out,我们可以指定生成任意文件
$ gcc test.c -o myfile //生成可执行文件为 myfile
$ gcc test.o -o myfile //继上一次生成的二进制文件执行链接,也是没有问题的
📃小结
关于各个命令选项可以巧记为 ESc
这是键盘上的一个键,忘记了可以看看
还有各个选项对应生成的文件后缀为 iso
📖库
1. 标准库的位置:
-
标准库头文件:标准库的头文件(如
stdio.h
、string.h
、stdlib.h
等)通常存放在/usr/include
目录下。这些头文件提供了库函数的声明和宏定义,函数的具体实现都在库中了。它们是编写 C 程序时必须包含的文件。 -
标准库的实现:标准库的实际实现(即函数的定义和逻辑)并不在
/usr/include
目录下,而是通常存放在系统的库目录中,比如/lib
或/usr/lib
。这些库可能是 静态库(以.a
为扩展名)或 动态库(以.so
为扩展名)
📃动态库
动态库 即通过 动态链接 的库,动态库 又称 共享库,因为 动态库 中的内容是被所有程序共享的,简言之 动态库 中的代码只需要存在一份,程序需要使用时,直接通过对应位置调用就行了
Linux 中默认使用 动态链接 的方式,我们可以通过指令 ldd 最终生成的文件 来查看最终生成文件的链接情况
$ ldd 最终生成的文件 //查看文件的链接情况
libXXX.so 是动态链接的标志
其中 lib 是前缀
.so 是后缀
去掉前缀与后缀,就是最终调用的库
举例:libc.so 去掉前缀与后缀,最终为 c ,可以看出文件最终调用的是C语言共享库,即 动态链接
动态链接 主要依赖不同函数在库中的位置信息进行调用,只有一份代码库,比较节省空间
我们还可以通过 file 命令查看文件详细信息
$ file 最终生成的文件 //查看文件的详细情况
📃静态库
除了 动态库 外,还有 静态库 ,采用 静态链接 的方式;静态链接 不同与 动态链接 共享的方式,如果程序调用 静态库 ,会将自己所需要的代码 拷贝至程序中 ,完成拷贝后,后续不需要再调用 静态库
如果想采用 静态链接 链接的方式编译程序,需要在编译时加上 -static 选项,当然前提是得有 静态库,没有的可以通过 yum install -y glibc-static 下载 静态库
当然我们也可以通过 ldd 最终生成的文件 查看是否为 静态链接
$ yum install -y glibc-static //下载静态库
$ gcc test.c -o myfile-static -static //采取静态链接的方式编译程序
$ ldd 最终生成的文件 //查看文件的链接方式
动态库 vs 静态库的优缺点对比:
区别 | 动态库 | 静态库 |
---|---|---|
调用方式 | 通过函数位置(动态链接)进行调用 | 直接将需要的函数拷贝至程序中(静态链接) |
依赖性(运行时) | 需要依赖于动态库文件,运行时必须能找到对应的 .so 文件 | 不依赖外部库,程序可以独立运行 |
空间占用 | 共享动态库中的代码,多个程序共享同一个库,节省空间 | 每个程序都包含库代码,导致文件较大 |
加载速度 | 调用时需要加载库并进行链接,加载速度慢 | 直接运行,程序中已经包含了库的代码,加载速度快 |
更新 | 更新库时,无需重新编译程序,方便管理和维护 | 更新库时需要重新编译程序,管理较为繁琐 |
版本兼容性 | 可能会遇到版本不兼容问题(“DLL Hell”) | 一旦编译完成,不受库版本变化影响 |
内存占用 | 多个程序可以共享同一个库文件,节省内存 | 每个程序都占用一份内存空间 |
动态库的优点:
-
共享代码:动态库可以在多个程序之间共享,节省磁盘空间和内存。对于大型程序和多个程序共享同一个库的情况,动态库非常有用。
-
程序小巧:因为动态库不包含在每个可执行文件中,所以生成的程序文件较小。
-
更新简便:如果库的功能有更新,只需要替换库文件,无需重新编译所有依赖这个库的程序。这使得系统升级和维护更加方便。
-
内存共享:多个程序运行时,可以共享动态库中的代码和数据,节省内存。
动态库的缺点:
-
加载速度较慢:由于程序在运行时需要加载和链接动态库,调用速度相对较慢,特别是在频繁调用库函数的情况下。
-
运行时依赖性:程序需要在运行时找到并加载正确的动态库版本。如果缺少动态库或版本不兼容,程序可能无法正常运行(例如,缺少
.so
文件)。 -
版本问题:如果系统中多个程序依赖于同一个动态库,而库的版本发生变化时,可能会导致“版本不兼容”(DLL Hell)的问题。
静态库的优点:
-
独立性:静态库在编译时就已链接到可执行文件中,程序不依赖外部的库文件,减少了运行时的复杂性。
-
加载速度快:静态库的代码已经包含在程序中,程序启动时不需要额外加载库,加载速度较快。
-
无需担心版本问题:由于静态库在编译时就已经链接到程序,程序和库的版本不会再发生兼容性问题。
静态库的缺点:
-
空间占用大:每个程序都需要包含静态库的副本,因此生成的可执行文件较大,浪费存储空间。
-
更新麻烦:如果需要更新库,必须重新编译程序,这对于大型项目或多个依赖同一库的项目来说,管理和更新较为麻烦。
-
内存占用多:每个运行的程序都加载静态库的代码,占用更多内存,而动态库则可以被多个程序共享内存。
总结:
-
动态库适用于:
-
需要多个程序共享同一份代码库的场景,尤其是在内存和磁盘空间有限的情况下。
-
程序开发周期较长,库需要经常更新,且更新后不想重新编译所有依赖程序的情况。
-
对更新灵活性要求较高,且能够接受可能出现的加载速度和依赖问题。
-
-
静态库适用于:
-
对程序启动速度要求较高,且不依赖外部库的场景。
-
程序体积可以接受,且不需要频繁更新库的情况。
-
独立部署的应用程序,不想担心外部库的兼容性问题。
-
选择使用动态库还是静态库,通常要根据具体项目的需求、系统资源以及维护成本来决定。如果项目中有多个依赖共享的库文件,动态库往往是更好的选择;而如果项目需要更高的执行效率或独立性,静态库可能更适合。
相关文章:
Linux工具学习之【gcc/g++】
📘前言 书接上文,我们已经学习了 Linux 中的编辑器 vim 的相关使用方法,现在已经能直接在 Linux 中编写C/C代码,有了代码之后就要尝试去编译并运行它,此时就可以学习一下 Linux 中的编译器 gcc/g 了,我们一…...
5.0.2 颜色16进制格式含义 控件template中path的使用
本例要实现的目标如下: 1.右上角的按钮是X的形式(使用path用两根直线绘制) 2.鼠标移动上去以及鼠标点击背景色都变化。(使用不同透明度的白色来区分表示) 一、关于颜色的表示 在C# WPF和WinForms中,Background 属性用于设置控件的背景颜色,可以使用16进制(HEX)格式来表…...
【sharding-jdbc配置以及例子】
一、一个数据库不同的表(分表) (1)POM <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId…...
OJ笔试强训_1至24天
OJ笔试强训 Day01 [NOIP2010]数字统计_牛客题霸_牛客网 点击消除_牛客题霸_牛客网 两个数组的交集_牛客题霸_牛客网 Day02 牛牛的快递_牛客题霸_牛客网 最小花费爬楼梯_牛客题霸_牛客网 数组中两个字符串的最小距离__牛客网 Day03 简写单词_牛客题霸_牛客网 dd爱框框_…...
多态:面向对象编程的重要特性
摘要:本文全面阐述了面向对象编程中多态这一关键特性,从多态的形式、使用场景、定义及前提条件出发,深入分析其运行特点、弊端,详细介绍引用类型转换相关知识,并通过综合练习强化对多态的理解与应用,为深入…...
使用 Vue 开发登录页面的完整指南
一、项目搭建与基础配置 环境准备 使用 Vue CLI 或 Vite 创建项目,推荐组合:Vue3 Element Plus Vue Router npm create vuelatest npm install element-plus element-plus/icons-vue vue-router 全局配置(main.js) import { c…...
【Pandas】pandas DataFrame isin
Pandas2.2 DataFrame Indexing, iteration 方法描述DataFrame.head([n])用于返回 DataFrame 的前几行DataFrame.at快速访问和修改 DataFrame 中单个值的方法DataFrame.iat快速访问和修改 DataFrame 中单个值的方法DataFrame.loc用于基于标签(行标签和列标签&#…...
Linux 网络接口 /sys/class/net/eth0 文件详解
以下是对 /sys/class/net/eth0 目录下每个文件或目录的详细讲解。这些文件是 Linux 系统中 sysfs 文件系统的一部分,提供了与网络接口(这里是 eth0)相关的配置和状态信息。每个文件或目录的内容反映了网络接口的特定属性或状态,通…...
java+postgresql+swagger-多表关联insert操作(九)
入参为json,然后根据需要对多张表进行操作: 入参格式: {"username": "车主01","usertel": "11111111111","useridtype": "2","useridcard": null,"proname&qu…...
Jsp技术入门指南【六】jsp脚本原理及隐式对象
Jsp技术入门指南【六】jsp脚本原理及隐式对象 前言一、JSP 脚本元素1.1 声明1.2 表达式1.3 脚本标签 二、JSP 的隐式对象是什么三、隐式对象详解outrequestsessionapplicationconfigexception 前言 在之前的博客中,我们已经介绍了JSP的环境搭建、编译文件查找以及生…...
邮件自动回复助手(Rasa/SMTP)实现教程
在现代办公场景中,处理大量邮件是一项既耗时又容易出错的任务。为了提升工作效率,我们可以利用自然语言处理(NLP)和邮件传输协议(SMTP)技术,构建一个智能的邮件自动回复助手。本文将详细介绍如何…...
【vLLM 学习】Aqlm 示例
vLLM 是一款专为大语言模型推理加速而设计的框架,实现了 KV 缓存内存几乎零浪费,解决了内存管理瓶颈问题。 更多 vLLM 中文文档及教程可访问 →https://vllm.hyper.ai/ 源代码:vllm-project/vllm from vllm import LLM, SamplingParams fr…...
《数据结构之美--链表oj练习》
链表oj题分享 1. 移除链表元素 题目: 思路分析: 根据题目描述,可以看出该题是要将满足条件的链表元素删除,并且返回新的头结点. 首先我们想到的肯定是直接遍历该链表然后对满足条件的元素进行删除,但删除某个元素时…...
杂记-LeetCode中部分题思路详解与笔记-HOT100篇-其四
那今天我们就把Hot100的所有题都完结了吧,Hot100作为大多数人笔试题的入门之选,可以说是非常的经典了,但是俗话说得好,书读百遍,其意自现,我不支持反复地只刷部分算法题,但是我支持周期性地刷刷…...
SpringBoot私人西服系统开发与设计
概述 基于SpringBoot的私人西服系统项目,是一个实用的服装管理系统。该系统包含了西服选择、面料选择、预约管理等核心功能。 主要内容 1. 管理员功能模块 用户管理:管理注册用户信息服装款式管理:管理西服款式信息面料类别管理ÿ…...
2.2/Q2,Charls最新文章解读
文章题目:Association of uric acid to high-density lipoprotein cholesterol ratio with the presence or absence of hypertensive kidney function: results from the China Health and Retirement Longitudinal Study (CHARLS) DOI:10.1186/s12882-…...
云端免费训练 AI 大模型推荐(适用于个人学习)
学习 AI 大模型训练(如LLM、扩散模型等),云端服务器是必不可少的,因为大模型对算力(GPU/TPU)和内存要求极高。以下是 适合不同学习阶段 的云端服务器推荐,涵盖 免费、低成本、高性能 选项&#…...
《操作系统真象还原》第九章(2)——线程
《操作系统真象还原》第九章(2)——线程 文章目录 《操作系统真象还原》第九章(2)——线程前言多线程调度简单优先级调度的基础任务调度器和任务切换注册时钟中断处理函数实现调度器schedule实现任务切换函数switch_to启用线程调度…...
Windows程序包管理器WinGet实战
概述 WinGet,Windows Package Manager,Windows软件包管理器,开源在GitHub,GitHub Releases可下载,官方文档。 WinGet由一个命令行工具和一组用于在Windows 10/11等版本上安装应用的服务组成,可帮助用户快…...
【特殊场景应对1】视觉设计:信息密度与美学的博弈——让简历在HR视网膜上蹦迪的科学指南
写在最前 作为一个中古程序猿,我有很多自己想做的事情,比如埋头苦干手搓一个低代码数据库设计平台(目前只针对写java的朋友),比如很喜欢帮身边的朋友看看简历,讲讲面试技巧,毕竟工作这么多年,也做到过高管,有很多面人经历,意见还算有用,大家基本都能拿到想要的offe…...
番外篇 | SEAM-YOLO:引入SEAM系列注意力机制,提升遮挡小目标的检测性能
前言:Hello大家好,我是小哥谈。SEAM(Squeeze-and-Excitation Attention Module)系列注意力机制是一种高效的特征增强方法,特别适合处理遮挡和小目标检测问题。该机制通过建模通道间关系来自适应地重新校准通道特征响应。在遮挡小目标检测中的应用优势包括:1)通道注意力增强…...
Top100(26-30)
二叉树的中序遍历 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 示例 1: 输入:root [1,null,2,3] 输出:[1,3,2] 示例 2: 输入:root [] 输出:[] 示例 3: 输入&#x…...
在 Vue 3 中将拆分后的数组合并回原数组
接上文Vue 3 中按照某个字段将数组分成多个数组_vue3怎么进行数组对象--分割对象-CSDN博客 方法一:使用 flat() 方法 // 假设这是拆分后的多维数组 const splitArrays [[{id: 1, category: A}, {id: 3, category: A}],[{id: 2, category: B}, {id: 5, category: …...
MyBatis如何配置数据库连接并实现交互?
如果你用过MyBatis,肯定知道它的核心功能之一就是数据库连接管理。但很多新手在第一次配置时总会遇到各种问题:数据源怎么配?连接池参数如何调优?XML和注解方式有什么区别?今天我们就来彻底搞懂MyBatis连接数据库的每一…...
PyTorch入门------卷积神经网络
前言 参考:神经网络 — PyTorch Tutorials 2.6.0cu124 文档 - PyTorch 深度学习库 一个典型的神经网络训练过程如下: 定义一个包含可学习参数(或权重)的神经网络 遍历输入数据集 将输入通过神经网络处理 计算损失(即…...
Qt官方案例知识点总结(图形视图——Colliding Mice)
Colliding Mice 案例 图元可重写下面的方法,返回一个QPainterPath(形状),该形状基于图形项自己的坐标系 返回的形状用于碰撞检测、命中测试等,形状越精确,那么碰撞检测等就越准确 不重写的话,默认取 boundingRect()…...
人工智能在后端开发中的革命:从架构到运维
后端开发作为应用程序的"大脑",正在经历人工智能带来的深刻变革。从智能API设计到自动化数据库优化,从异常预测到资源调度,AI技术正在重塑后端开发的各个方面。本文将全面探讨AI如何赋能现代后端系统开发,并通过实际案例展示这些技术的应用价值。 一、智能API开…...
电子电器架构 --- EOL 工厂刷写(产线)
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…...
AI数据分析与BI可视化结合:解锁企业决策新境界
大家好,今天我们来聊聊一个前沿而热门的话题——AI数据分析与BI可视化结合,如何携手推动企业决策迈向新高度。在数据爆炸的时代,企业如何高效利用这些数据,成为制胜的关键。AI数据分析与BI可视化的结合,正是解锁这一潜…...
深度学习3.2 线性回归的从零开始实现
3.2.1 生成数据集 %matplotlib inline import random import torch from d2l import torch as d2ldef synthetic_data(w, b, num_examples):# 生成特征矩阵X,形状为(num_examples, len(w)),符合标准正态分布X torch.normal(0, 1, (num_examples, len(w…...
ArcPy工具箱制作(下)
在上一篇博客中,我们已经初步了解了如何制作ArcPy工具箱,包括工具箱的基本概念、准备工作、脚本编写以及将脚本转换为工具箱的步骤。今天,我们将继续深入探讨ArcPy工具箱的制作,重点介绍一些进阶技巧和优化方法. 一、优化工具箱的…...
if/switch语句初始化功能
基础介绍 这个特性是在c17版本引入的,在这之前是不允许在if语句或者switch语句中使用赋值语句,不仅仅是if语句和switch语句,包括lambda表达式在c17版本也支持类在捕获表达式中支持赋值操作。言归正传,下面阐述这个特性的基本语法…...
cmake 语法大纲
1,基础语法 CMakeLists.txt 目录组织文件; *.cmake 脚本文件 运行: $ cmake -P xxx.cmake *.cmake 模块文件 include 命令来引用 模块文件。 自定义模块; cmake 预制模块; 单行注释 # com 括号注释 #…...
前端单元测试实战:如何开始?
实战:如何开始单元测试 1.安装依赖 npm install --save-dev jest2.简单的例子 首先,创建一个 sum.js 文件 ./sum.js function sum(a, b) {return a b; }module.exports sum;创建一个名为 sum.test.js 的文件,这个文件包含了实际测试内…...
《软件设计师》复习笔记(12.2)——成本管理、配置管理
目录 一、项目成本管理 1. 定义 2. 主要过程 3. 成本类型 4. 其他概念 真题示例: 二、软件配置管理 1. 定义 2. 主要活动 3. 配置项 4. 基线(Baseline) 5. 配置库类型 真题示例: 一、项目成本管理 1. 定义 在批准…...
edge browser for linux debian
下载地址 https://www.microsoft.com/en-us/edge/download?formMA13FJ 安装 # 下载安装包 wget https://packages.microsoft.com/repos/edge/pool/main/m/microsoft-edge-stable/microsoft-edge-stable_135.0.3179.85-1_amd64.deb?brandM102 # 安装 sudo dpkg -i microsoft…...
Python读取Excel表格数据并写成JSON格式文件(精简版)
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 1. 步骤步骤 1: 安装必要的库步骤 2: 读取Ex…...
服务器的算力已经被被人占用了,我如何能“无缝衔接”?
今天遇到一个问题,服务器已经被别人占用了,我又不知道什么时候他能结束,因此很难去训练自己的模型,隔一会去看看别人是否结束又太麻烦,于是便可以写这个脚本文件来自动检测服务器是否空闲,一有空闲就可以自…...
rulego-server是一个开源程序,是一个轻量级、无依赖性的工作流自动化平台。支持 iPaaS、流式计算和 AI 能力。
一、软件介绍 文末提供程序和源码下载学习 RuleGo-Server 是一个基于 RuleGo 构建的轻量级、高性能、模块化和集成友好的自动化工作流程平台。可用于自动化编排、iPaaS(集成平台即服务)、API 编排、应用编排、AI 编排、数据处理、IoT 规则引擎、AI 助手…...
『前端样式分享』联系我们卡片式布局 自适应屏幕 hover动效 在wikijs中使用 (代码拿来即用)
目录 预览效果分析要点响应式网格布局卡片样式:阴影和过渡效果 代码优化希望 长短不一的邮箱地址在左右居中的同时,做到左侧文字对齐(wikijs可用)总结 欢迎关注 『前端布局样式』 专栏,持续更新中 欢迎关注 『前端布局样式』 专栏,持续更新中…...
航电系统之通信技术篇
航电系统(航空电子系统)的通信技术是现代航空器的核心技术之一,其核心目标是实现飞行器内部各系统之间以及飞行器与外部设备(如地面控制中心、其他飞行器等)之间高效、可靠的信息交互。随着航空技术的不断发展…...
4.3 熟悉字符串处理函数
作为一名C语言初学者,掌握字符串处理函数是编程道路上不可或缺的一步。字符串是C语言中处理文本数据的基础,而标准库提供了一系列强大的字符串处理函数,极大地方便了我们的开发工作。本文将带领大家熟悉这些常用的字符串处理函数,…...
二叉树理论基础
二叉树种类 满二叉树:每个非叶子节点都有且只有两个子节点。 和完全二叉树:除了最底层外,其他各层都是满的;最底层的节点都集中在左侧。 二叉搜索树:对于任意节点 u,左子树上所有节 点的值都小于 u.val…...
yarn的三个资源调度策略
### YARN 的三种资源调度策略及其工作原理与区别 #### 1. **FIFO Scheduler (先进先出调度器)** FIFO Scheduler 是一种最简单的调度方式,所有的应用程序都按顺序排队等待执行。其基本逻辑如下: - 应用程序按照提交的时间先后顺序依次进入队列。 - 当集…...
leetcode0112. 路径总和-easy
1 题目:路径总和 官方标定难度:易 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ࿱…...
铁氧体和纳米晶:车载定制电感的材料选择
最近有个做车载产品的粉丝问到:我们的定制电感产品既会用到铁氧体磁芯,也会用到纳米晶磁芯,那么这两种材料,该如何选择呢? 要回答这个问题,我们首先要对两种材料做一个基本的对比。 铁氧体材料成本低&…...
MCP认证难题破解
一、MCP 认证体系现状与核心挑战 微软认证专家(MCP)体系在 2020 年后逐步向基于角色的认证转型,例如 Azure 管理员(AZ-104)、数据分析师(DP-100)等,传统 MCP 考试已被取代。当前备考的核心难题集中在以下方面: 1. 技术栈快速迭代 云原生技术占比提升:Azure 认证中,…...
ROS机器人一般用哪些传感器?
以下是ROS机器人常用传感器的分层详解及思维导图总结,涵盖传感器分类、核心参数、ROS支持及典型应用: 一、环境感知传感器 1. 视觉传感器 类型 原理 ROS支持 数据类型 典型型号/驱动 优缺点及应用场景 单目摄像头 单镜头成像,通过透视变换获取2D图像,依赖算法推断深度 驱…...
【ubuntu】在Linux Yocto的基础上去适配Ubuntu的wifi模块
一、修改wifi的节点名 1.找到wifi模块的PID和VID ifconfig查看wifi模块网络节点的名字,发现是wlx44876393bb3a(wlxmac地址) 通过udevadm info -a /sys/class/net/wlx44876393bba路径的命令去查看wlx44876393bba的总线号,端口号…...
基于WebRTC技术的EasyRTC:支持任意平台设备的实时音视频通信解决方案
一、技术架构与核心优势 EasyRTC是一套基于WebRTC技术的实时音视频通信框架,旨在为开发者提供高效、稳定、跨平台的通信解决方案。其核心优势在于支持任意平台设备,包括Web端、移动端、桌面端和嵌入式设备,真正实现“一次开发,多…...