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…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...
LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》
🧠 LangChain 中 TextSplitter 的使用详解:从基础到进阶(附代码) 一、前言 在处理大规模文本数据时,特别是在构建知识库或进行大模型训练与推理时,文本切分(Text Splitting) 是一个…...

麒麟系统使用-进行.NET开发
文章目录 前言一、搭建dotnet环境1.获取相关资源2.配置dotnet 二、使用dotnet三、其他说明总结 前言 麒麟系统的内核是基于linux的,如果需要进行.NET开发,则需要安装特定的应用。由于NET Framework 是仅适用于 Windows 版本的 .NET,所以要进…...