Linux基础3-基础工具2(vim详解,gcc详解)
上篇文章:Linux基础3-基础工具1(什么是工具,yum,vim基础)-CSDN博客
本章重点:
1. vim详解
2. gcc详解
目录
一. vim详解
1.1 命令模式
1.2 插入模式
1.3 底行模式
二. gcc/g++
2.1 程序的翻译过程(c/c++代码执行过程)
2.2 gcc/g++使用说明
2.3 动态链接与静态链接
2.4 查看Linux文件的链接方式和使用的标准库
2.5 gcc/g++直接生成可执行文件
2.6 gcc使用静态链接
三. 下章重点
3.1 自动化构建工具make,makefile
3.2 Linux调试器gbd的使用
一. vim详解
我们知道vim常用的三种模式(命令模式,插入模式,底行模式)。这三种模式的转化图如下
1.1 命令模式
总结比较常用的vim命令
定位操作
shift + 4($符号)将光标定位到该行的末尾(行右)
shift + 6(^符号)将光标定位到该行的行首(行左)
shift + g(G) 将光标定位到底部(底部)
gg 将光标定位到顶部(顶部)
文件操作
复制:文件所在行输入 yy,n(数字)+yy可以复制n行
粘贴:文件所在行输入p(输入p只粘贴一次,输入n+p会粘贴n次)
删除:文件所在行输入dd,n + dd可以删除n行
剪切:在一个光标所在处输入dd,在林另一个光标所在处输入 p
撤销:输入 u
取消撤销:ctrl + r
编辑操作
文件所在行替换大小写:shirt + ~
批量化替换:shift + r 进入替换模式即可
行内删除:x向左删除,X向右删除(可以输入n删除n个,并且支持使用p进行剪切)
1.2 插入模式
命名模式输入 i 或o或 a 即可进入插入模式,插入模式下直接输入即可插入文本
1.3 底行模式
命名模式下输入 shift : 即可进入底行模式。
w 写入 q 退出 wq 写入并退出 w!强制写入 q!强制退出
vs + 文件名 可以分屏(但无论分多少屏幕,都只有一个光标)
ctrl w w即可切换到其他屏幕。
! 加 shell 命名 即可在不退出文件的情况下执行linux命令
%s/printf/cout/g 即可将printf都替换成cout
二. gcc/g++
gcc/g++是Linux中的编译器。用于编译c/c++代码
2.1 程序的翻译过程(c/c++代码执行过程)
1. 预编译:去掉注释,头文件展开,宏替换,条件编译
2. 编译:检查语法,将代码转换为汇编代码
3. 汇编:将汇编代码转化为可重定向的二进制机器指令(不可执行的二进制目标文件)
4. 链接:链接多个二进制目标文件,形成可执行的目标文件
2.2 gcc/g++使用说明
例如:我们想编译运行下列代码,文件名字为 test.c
#include<stdio.h>int main()
{printf("hello wolrd!\n");return 0;
}
1. 预编译
gcc -E test.c -o test.i -E #执行程序的预编译工作,完成后停下来-o #指形成文件的临时文件名称
2. 编译
gcc -S test.i -o test.s-S #表示完成程序的编译阶段,变成汇编代码之后,停下来
3. 汇编
gcc -c test.s -o test.o#完成程序的汇编工作,生成可重定向的不可执行二进制文件。停下来
4. 链接
gcc test.o -o test#链接的过程,将库中的代码和我们自己写的代码链接起来,形成可执行的二进制文件
5. 运行test
./test# ./ + 可执行二进制文件 即可运行
2.3 动态链接与静态链接
链接的本质(关联我们的代码和库代码)
我们写代码只是写了代码的调用,没有写对应的实现。只有当我们链接库代码之后,标准库的实现代码才能和我们的代码关联
动态链接:讲我们的程序和通过连接器和标准库关联,需要使用标准库的时候去标准库中找
静态链接:链接的时候,不和标准库关联,而是在我们程序内部,将要用的方法,给我们拷贝一份,就完成了静态链接
动静态链接的优缺点:
动态链接:由于没有拷贝,形成的可执行文件非常小,节省资源(占用内存,磁盘小,也方便别人下载)。
静态链接:不受库文件的升级或者删除,但是形成的可执行文件非常大,且如果有多个可执行文件,会造成代码高度重复。
2.4 查看Linux文件的链接方式和使用的标准库
前置知识:
1. Linux文件库的命名
动态库:libxxxxx.so
静态库:linxxxxx.a
2. file + 文件 (可以查看文件的链接方式)
3. ldd + 文件 (可以查看文件使用的标准库)
C语言
C++
从图中也可得出:gcc/g++ 默认使用的是动态链接
运行结果如下:
2.5 gcc/g++直接生成可执行文件
gcc test.c -o test
# gcc .c文件 -o 可执行目标文件
# 即可直接生成可执行文件
举例:
2.6 gcc使用静态链接
1. 如果没有下载.c静态库需要先下载
2. 使用静态链接
gcc test.c -o test.s -static# gcc 代码文件.c -o 可执行目标文件 -static
# 目标文件可以使用.s进行标识
举例:
可以看出静态链接的可执行文件非常大
test.s 比 test 大 100倍左右
静态链接无法ldd
使用file进行查看,为静态链接
像shell python 这种脚本语言在linux中可以直接运行
甚至使用chmod+可执行权限就能直接运行
三. 下章重点
3.1 自动化构建工具make,makefile
3.2 Linux调试器gbd的使用
相关文章:

Linux基础3-基础工具2(vim详解,gcc详解)
上篇文章:Linux基础3-基础工具1(什么是工具,yum,vim基础)-CSDN博客 本章重点: 1. vim详解 2. gcc详解 目录 一. vim详解 1.1 命令模式 1.2 插入模式 1.3 底行模式 二. gcc/g 2.1 程序的翻译过程(c/c代码执行过…...

GEE教程:利用sentinel-2数据进行ndwi和ndci指数的计算和下载
目录 简介 函数 normalizedDifference(bandNames) Arguments: Returns: Image Export.image.toDrive(image, description, folder, fileNamePrefix, dimensions, region, scale, crs, crsTransform, maxPixels, shardSize, fileDimensions, skipEmptyTiles, fileFormat, …...

markdown-it:将Markdown文本转换为HTML格式,展示在页面,怎么自定义里面的a标签设置为在新标签页打开
由markdown-it将文本生成html然后渲染到页面上,但是现在你点击里面生成好的链接只能在本标签页打开,怎么将其设置为在新标签打开呢? 安装markdown-it npm install markdown-it 使用markdown-it const mdi new MarkdownIt({html: true,l…...

linux在工作中常用命令
简介 记录在日常工作中,常用linux命令 查日志篇 1.统计特定内容出现的行数和次数 1.查询特定内容出现的行数 grep -c "关键词" 文件名-c:只显示匹配的行数。 2.查询特定内容出现的次数 grep -o "关键词" 文件名 | wc -l-o:只显示…...

828华为云征文|部署知识库问答系统 MaxKB
828华为云征文|部署知识库问答系统 MaxKB 一、Flexus云服务器X实例介绍1.1 云服务器介绍1.2 核心竞争力1.3 计费模式 二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 MaxKB3.1 MaxKB 介绍3.2 Docker 环境搭建3.3 MaxKB 部署3.4 Max…...

数据结构之算法复杂度
目录 前言 一、复杂度的概念 二、时间复杂度 三、大O的渐进表示法 四、空间复杂度 五、常见复杂度对比 总结 前言 本文主要讲述数据结构中的算法复杂度 一、复杂度的概念 算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源。因此衡量一个算法的好坏…...

Python用TOPSIS熵权法重构粮食系统及期刊指标权重多属性决策MCDM研究|附数据代码...
原文链接:https://tecdat.cn/?p37724 在当今世界,粮食系统的稳定性至关重要。尽管现有的全球粮食系统在生产和分配方面表现出较高的效率,但仍存在大量人口遭受饥饿以及诸多粮食安全隐患。与此同时,在学术领域,准确评估…...

【例题】lanqiao4403 希尔排序模板题
插入排序每次只能将数据移动一位。 已知插入排序代码为: def insert_sort(a):for i in range(1,len(a)):ji-1while j>0 and a[j]>a[i]:a[j1]a[j]j-1a[j1]a[i]return a希尔排序在插入排序的基础上,将数据移动n/2,n/4,…,1位。 for i in range(ga…...

【C/C++】速通涉及string类的经典编程题
【C/C】速通涉及string类的经典编程题 一.字符串最后一个单词的长度代码实现:(含注释) 二.验证回文串解法一:代码实现:(含注释) 解法二:(推荐)1. 函数isalnum…...

MySQL:库表的基本操作
库操作 查看 查看存在哪些数据库: show databases;查看自己当前处于哪一个数据库: select database(); 由于我不处于任何一个数据库中,此处值为NULL 查看当前有哪些用户连接到了MySQL: show processlist; 创建 创建一个数据库 语…...

JS领域的AI工程利器分享
JavaScript,这个在网页开发中广为人知的脚本语言,正逐渐在AI工程领域展现出其独特的魅力。对于那些希望将大语言模型(LLM)融入项目的开发者来说,以下五个JavaScript工具将是关键资源。 1. TensorFlow.js TensorFlow.…...

2024/9/20 使用QT实现扫雷游戏
有三种难度初级6x6 中级10x10 高级16x16 完成游戏 游戏失败后,无法再次完成游戏,只能重新开始一局 对Qpushbutton进行重写 mybutton.h #ifndef MYBUTTON_H #define MYBUTTON_H #include <QObject> #include <QWidget> #include <QPus…...

09.20 C++对C的扩充以及C++中的封装、SeqList
SeqList.h #ifndef SEQLIST_H #define SEQLIST_H#include <iostream> #include<memory.h> #include<stdlib.h> #include<string.h>using namespace std;//typedef int datatype; //类型重命名 using datatype int;//封装一个顺序表 class Seq…...

Git提交类型
说明:Git提交类型指的是代码commit时,写在comment前面的标志,表示此次commit的提交类型,如下: Git提交类型 常见的Git提交类型有: feat:新特性、新功能或优化; fix:修复…...

C++速通LeetCode简单第18题-杨辉三角(全网唯一递归法)
全网唯一递归法: vector<vector<int>> generate(int numRows) {vector<int> v;vector<vector<int>>vn;if (numRows 1){v.push_back(1);vn.push_back(v);v.clear();return vn;//递归记得return}if (numRows 2){v.push_back(1);vn.p…...

Redis作为单线程模型,为什么效率高、速度快呢?
前言: 效率高、速度快是相较于数据库来说的(MySQL、Orcale、SQL server) 文章目录 一、单线程模式的工作流程二、为什么快? 一、单线程模式的工作流程 这里我们所说的单线程是指:Redis只使用一个线程,来处…...

人工智能——猴子摘香蕉问题
一、实验目的 求解猴子摘香蕉问题,根据猴子不同的位置,求解猴子的移动范围,求解对应的过程,针对不同的目标状态进行求解。 二、实验内容 根据场景有猴子、箱子、香蕉,香蕉挂天花板上。定义多种谓词描述位置、状态等…...

对ViT 中Patch Embedding理解
借鉴了这个博主的ViT Patch Embedding理解-CSDN博客,再加了一些理解。 就通过代码来理解吧 假设输入图像的维度为HxWxC,分别表示高,宽和通道数。 PatchEmbed 的类,它继承了 nn.Module,实现了将输入的2维图像&#…...

Redis基本命令详解
1. 基本命令 命令不区分大小写,而key是区分大小写的 # select 数据库间的切换 数据库共计16个 127.0.0.1:6379> select 1# dbsize 返回当前数据库的 key 的数量 127.0.0.1:6379[1]> dbsize# keys * 查看数据库所有的key 127.0.0.1:6379[1]> keys *# fl…...

Java之线程篇四
目录 volatile关键字 volatile保证内存可见性 代码示例 代码示例2-(volatile) volatile不保证原子性 synchronized保证内存可见性 wait()和notify() wait()方法 notify() 理解notify()和notifyAll() wait和sleep的对比 volatile关键字 volati…...

计算机毕业设计之:基于微信小程序的校园流浪猫收养系统
博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…...

SpringBoot:关于Redis的配置失效(版本问题)
我们使用redis时发现yaml配置中的redis相关配置不生效,后面发现将配置修改甚至删除所有相关redis的配置,springboot依然能使用redis里面默认的db0并且不报错。上网查阅了一些文章,也都没有解决今天分享下,我的处理方法, SpringBo…...

halcon 快速定义字典
定义一个名为params的字典 Params : dict{} 等价于用 create_dict (Params ) 为字典添加键值对,在halcon中箭只能是字符串,值可以是任何类型的obj或者tuple Params.remove_outer_edges : true Params.max_gap : 150 等价于用 set_dict_object (true,…...

Sublime text3怎么关闭提示更新
问题 sublime text 3有新版本后,会不停地在每次启动后弹窗提示更新版本 第一步 软件安装之前,切记是软件安装之前!!!需要在hosts中添加以下内容(屏蔽官网联网检测):hosts的位置一般在C:\Windows\System32\drivers\etc…...

生成式语言模型技术栈
生成式语言模型的最新技术栈正在快速发展,尤其是随着大规模预训练模型(LLMs)和生成式AI的应用不断扩展。以下是当今最前沿的生成式语言模型技术栈,涵盖从模型开发到优化、推理和部署的各个环节。 1. 基础模型开发 基础模型开发包…...

进程分析工具Process Explorer使用
进程分析工具Process Explorer使用 Process Explorer让使用者能了解看不到的在后台执行的处理程序,能显示目前已经载入哪些模块,分别是正在被哪些程序使用着,还可显示这些程序所调用的DLL进程,以及他们所打开的句柄。Process Expl…...

vue 中如何实现鼠标拖动出发滚动条的跟随移动?
使用场景 在做弹窗、表单或 tab 切换需求的时候,有时候因为内容过长会导致出现滚动条,但是只能拖动滚动条时会导致操作不便,我们会希望实现通过拖动内容区实现滚动条的滑动。这样操作就会简单多了。 实现思路 如果要实现鼠标辅助触发滚动条…...

【Java EE】文件IO
Author:MTingle major:人工智能 --------------------------------------- Build your hopes like a tower! 目录 一、文件是什么? 二、针对文件系统操作的API 1.文件路径,文件名,文件是否存在 2. 创建文件 3.删除文件&#…...

使用 React、Material-UI、Spring、MySQL、MyBatis 以及高德 API 模拟实时位置信息
要使用 React、Material-UI、Spring、MySQL、MyBatis 以及高德 API 模拟实时位置信息,你可以按以下步骤来实现: 目录 1. 前端 (React Material-UI) 2. 后端 (Spring Boot MyBatis MySQL) 3. 模拟实时位置数据 4. 前后端联调 1. 前端 (React Mat…...

UniApp一句话经验: px -> rpx动态转换和动态元素区域的获取
px->rpx转换 在多终端条件下,什么devicePixelRatio,upx2px都是不靠谱的,最直接的是这样: const { screenWidth } uni.getSystemInfoSync()const pixelUnit screenWidth / 750 // rpx->px比例基数 动态元素区域获取 多终…...