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…...
为什么视频代剪辑会影响你的内容传播效果
为什么你精心拍的视频,发出去却没人看? 你有没有过这样的经历:花了一整天拍Vlog,素材画质高清、内容真实,可一剪出来就显得平淡无奇,点赞寥寥?或者婚礼当天感动全场,回看成片却像流水…...
一次搞懂内存取证:用Volatility3和Cobalt Strike分析工具复现VNCTF‘来一把紧张刺激的CS’
实战内存取证:从Volatility3到Cobalt Strike信标分析全解析 在网络安全事件响应中,内存取证往往是发现高级威胁的最后一道防线。当攻击者使用文件无落地的技术时,传统的磁盘取证可能一无所获,而内存中却保留着攻击行为的完整痕迹。…...
【紧急预警】92%的DeepSeek测试用例生成失败源于这4个隐性配置缺陷——资深SDET连夜整理修复清单
更多请点击: https://codechina.net 第一章:DeepSeek测试用例生成的现状与危机本质 当前,DeepSeek系列大模型(如DeepSeek-Coder、DeepSeek-VL)在代码生成与理解任务中展现出强大能力,但其测试用例自动生成…...
HarmonyOS ArkTS DateUtil 日期增减与日历计算完整指南
文章目录 背景一、引言二、日期增减方法详解使用示例 三、日历计算方法详解四、Demo 演示:日期增减结果展示五、Demo 演示:月历视图完整实现六、日历视图关键点解析为什么要填充前置空格?getLastDayOfMonth 的实现技巧 七、小结 背景 近期发现…...
FM3773 低功耗离线式恒流/恒压 PSR 控制器
概述 FM3773 是一种高性能的交流/直流用于电池充电器和适配器的电源控制器,内置 850V 功率三极管。该设备采用脉冲频率调制(PFM)的方法来建立非连续导通模式(DCM)反激式电源。 FM3773 提供精确的恒定电压,恒…...
LPCM框架:大模型驱动的计算机架构设计革命
1. LPCM框架:计算机系统架构设计的范式革命计算机系统架构设计正站在历史性的转折点上。过去八十年来,从ENIAC的真空管到现代7纳米制程的异构计算芯片,架构设计始终遵循着"专家经验EDA工具"的传统范式。但随着摩尔定律逼近物理极限…...
从无线破解到PDF解密:盘点那些容易被忽略的‘非主流’密码审计场景与工具
密码安全审计的隐秘战场:从无线网络到加密文档的实战指南 当大多数人谈论密码安全时,脑海中浮现的往往是服务器登录、数据库访问这些企业级场景。然而在数字生活的每个角落,从家庭Wi-Fi到工作文档,密码保护的脆弱性同样可能成为安…...
Unity新手避坑指南:NavMesh烘焙参数(Agent Radius/Height)到底怎么设?附场景实测
Unity导航系统深度解析:Agent参数设置与场景适配实战在Unity游戏开发中,导航系统(Navigation System)是实现角色智能移动的核心模块。对于刚接触Unity导航系统的开发者来说,Agent Radius(代理半径)和Agent Height(代理身高)这两个参数的设置往…...
解决claude code频繁封号与token不足的taotoken接入方案
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 解决Claude Code频繁封号与Token不足的Taotoken接入方案 1. 问题背景:Claude Code用户面临的挑战 对于依赖Claude Cod…...
PrediPrune:机器学习驱动的编译器超级优化候选剪枝策略
1. 项目概述与核心挑战在编译器优化的世界里,我们总在追求极致的性能。传统的编译器优化器,比如LLVM的Pass,依赖于一系列预定义的、经过验证的转换规则。它们很高效,但想象力也受限于这些规则。超级优化器(Superoptimi…...
