Linux开发工具的使用(vim、gcc/g++ 、make/makefile)
文章目录
- 一 :vim
- 1:vim基本概念
- 2:vim的常用三种模式
- 3:vim三种模式的相互转换
- 4:vim命令模式下的命令集
- - 移动光标
- -删除文字
- -剪切/删除
- -复制
- -替换
- -撤销和恢复
- -跳转至指定行
- 5:vim底行模式下的命令集
- 二:gcc/g++
- 1:gcc/g++的作用
- 2:gcc/g++的语法
- 3:预处理
- 4:编译
- 5:汇编
- 6:链接
- 7:函数库
- - 动静态库
- - 动态链接的优缺点
- 8:静态链接的优缺点
- 三:make/makefile
- 依赖关系
- 依赖方法
- make工作原理
- 项目清理
一 :vim
1:vim基本概念
vim是Linux下的一个多模式的编译器 简单来说就是写代码的工具 不提供编译调试等功能
有语法高亮功能 可视化操作不仅可以在终端运行 还可以运行与x windows mac os windows
2:vim的常用三种模式

1、命令模式
控制光标的移动 字符,字或行 的删除 ,移动复制某区段
以及切换到插入模式和底行模式下
2、插入模式(使用最频繁的模式)
只有在插入模式下 才可以进行文字的输入
以及切换到命令模式
3、底行模式
文件保存或退出 也可以进行 文件替换 找字符串 列出行号等
以及切换到命令模式
3:vim三种模式的相互转换

命令模式切换到插入模式
输入a:进入插入模式后 从目标光标所在位置的下一个位置开始输入文字
输入i: 进入插入模式后 从光标当前位置开始输入
输入0:进入插入模式后 插入新的一行 从行首开始输入文字
命令模式 切换到底行模式
输入shift+;
插入模式/底行模式切换命令模式
按ESC即可
插入模式和底行模式之间不能相互转换
4:vim命令模式下的命令集
- 移动光标
- vim可以直接使用键盘来控制光标的上下左右移动,正规的vim使用的是小写字母
h j k l分别控制光标左下上右移动一格 也可以使用方向键进行移动 - 按
G:移动到文章的最后 - 按
gg:进入到文本开始 - 按
$(shift+4):移动到光标所在行的行尾 - 按
^(shift+6):移动到光标所在行的行首 - 按
n+Enter:光标向下移动n行 - 按
n+l:光标进去到改行的第n个位置 - 按
ctrl+b:屏幕向前翻一页 - 按
ctrl+f:屏幕向后翻一页 - 按
ctrl+u:屏幕向前翻半页 - 按
ctrl+d:屏幕向后翻半页 - 按
w:光标进入到下个字的开头 - 按
e:光标进入到下个字的自尾 - 按
b:光标回到上个字的开头
-删除文字
- 按
x:每按一次删除光标所在位置一个字符 - 按
n+x:删除光标所在位置后面的n个字符 - 按
X:删除光标所在位置前一个字符 - 按
n+X:删除光标所在位置后前面的n个字符
-剪切/删除
- 按
dd:剪切/删除光标所在行 - 按
n+dd:从光标所在行开始剪切/删除n行 - 按
p:将剪切的内容复制到光标所在位置下一行 - 按
n+p:将剪切的内容复制到光标所在位置下一行开始复制n行
-复制
- 按
yy:复制光标所在行到缓冲区 - 按
n+yy:复制从光标所在行往下数n行字符到缓冲区 - 按
p:将缓冲区的字符粘贴到光标所在位置下一行 - 按
yw:将光标所在位置到字尾的字符复制到缓冲区 - 按
n+yw:复制n个字到缓冲区
-替换
- 按
r: 替换光标所在处的字符 - 按
R:替换光标所在位置的字符 直到按下esc停止uu - 按
ctrl+~:快速切换大小写
-撤销和恢复
- 按
u:撤销 - 按
ctrl+r:恢复
-跳转至指定行
- 按
n+G:移动到第n行行首
5:vim底行模式下的命令集
在使用底行模式之前 先按ESC键确定自己处于命令模式 然后再按shift+;进入底行模式
- 输入
set nu:按回车后在文件中的每一行前列出行号 - 输入
set nonu:按回车后在文件中的取消列出的行号 - 输入
数字:按回车后就会跳转到该行行首 - 输入
w:保存文件 - 输入
w!:强制保存 - 输入
q:退出文件 - 输入
q!:强制退出文件 - 输入
wq:保存并退出文件 - 输入
vs+文件名:进行多文件操作 - 输入
ctrl+ww:光标在不同文件中切换 !+其他指令:在不退出vim的情况下执行Linux其他命令
二:gcc/g++
1:gcc/g++的作用
gcc/g++分别是GUN中的c和c++编译器
对于 .c和.cpp文件,gcc分别当做c和cpp文件编译(c和cpp的语法强度是不一样的)
对于 .c和.cpp文件,g++则统一当做cpp文件编译
在使用gcc之前 应该了解一个.c源文件到一个.exe可执行程序经历了哪些过程和函数库 # 程序编译链接的四个过程
- 预处理
完成头文件的展开 删去注释 宏替换等工作 - 编译
将源代码翻译成汇编语言 语法分析 词法分析 语义分析等 - 汇编
汇编代码转换成为二进制指令产生目标文件 - 链接
将汇编过程产生的二进制指令进行连接 生成可执行程序
2:gcc/g++的语法
gcc/g++ 选项 文件
常用选项:
-E :只进行预处理 不会生成文件 需要自己重定向到一个文件里
-S: 编译到汇编语言(生成.s文件) 不进行汇编和链接
-c:编译到目标文件 (生成.o文件) 不进行链接
-o:将执行结果输出到指定文件中
-static:对生成的文件采用静态链接
3:预处理
gcc -E -o test.i test.c
将源文件test.c进行预处理后停止 将是执行结果输出到test.i文件中

可以看到预处理阶段完成了头文件的展开 删去注释 宏替换等工作
4:编译
gcc -S test.s
将预处理阶段产生的test.i文件编译产生.s汇编文件


5:汇编
gcc -c test.s
将汇编文件test.s编译成产生.o目标文件


6:链接
gcc test.o
将目标文件链接产生可执行程序a.out

如果你也和我一样 不喜欢a.out 用-o进行重定向gcc -o test.exe test.o

可执行程序也是二进制指令

7:函数库
我们在c程序中,并没有实现printf函数,且在预编译中包含的头文件stiod.h中也仅仅只是有该函数的声明 并没有定以实现该函数 那么printf函数在哪里实现的呢?
在Linux中 系统把这些函数都实现在一个名为libc.so.6(Linux中的一个动态链接库 包含了标准c库的实现)的文件中 在没有特别指定时 gcc会到系统默认的路径’‘/usr/lib’'下进行查找,也就是链接到libc.so.6库函数中去 这样就能实现函数printf了 这也就是链接的作用
库函数一般分为静态库和动态库
- 动静态库
- 静态库是指在编译链接时 把库文件的代码全部加入到可执行文件中 因此生成的可执行程序文件会比较大 但在运行时也就不需要库文件了在linux下后缀名一般为.a windows中后缀名为.lib
- 动态库则是在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库 这样可以节省系统的开销 在Linux下后缀为.so windows后缀为.dll 前面所说的libc.so.6就是动态库
- gcc在编译时默认使用动态链接(使用file命令验证)
file 命令
语法: file 文件名
功能: 辨识文件类型

gcc/g++在编译时默认采用动态链接 我们也可以加上-static选项使用静态链接的方式编译
gcc -o newtest.exe test.c -static

采用静态链接 可执行程序会比较大
我们也可以查看一个可执行程序所依赖的库(使用ldd命令)
ldd 命令
语法: ldd 可执行程序
功能: 查看一个可执行程序依赖的库

- 动态链接的优缺点

8:静态链接的优缺点

三:make/makefile
- make/makefile 是Linux项目自动化构建的工具
- make是一个命令工具 是一个解释makefile当中的指令的工具
- makefile是一个文件 带来的好处就是自动化编译 makefile写的好 只需要一个make命令 就能完成整个工程的自动编译 极大提高了开发效率 一个比较大的工程源文件不计其数 按照其类型 功能 模块存放在若干个目录中 mkaefile定义了一系列的规则来指定哪些文件需要先编译 哪些文件需要后编译 甚至于进行更复杂的功能操作
- make需要和makefile互相搭配使用 完成项目的自动化构建
在使用make/makefile之前 先了解一下各个文件之间的依赖关系和依赖方法
依赖关系

依赖方法

make工作原理
- 当我们输入make命令时 make会在当前目录下寻找名为Makefile或者makefile的文件
- 找到之后 他会找文件中的第一个“目标文件” 上面makefile例子中 他会找到test这个文件 将这个文件作为最终的"目标文件"
- 如果test文件不存在 或者是test所依赖的后面test.o 文件的修改时间 要比这个test文件新 那么他就会执行后面所定义的命令来生成test这个文件
- 如果test所依赖的test.o文件不存在 那么make会在当前文件中找目标位test.o文件的依赖 找到的话 在根据那一个规则生成test.o文件
- 这就是整个make的依赖性 make会一层一层的去找文件的依赖关系 知道最终编译出第一个目标文件
- 如果在查找过程中 被依赖的文件找不到 make就会直接退出 并报错 如果是定义的命令错误 或者是编译不成功 make根本不会理-
- make只管文件的依赖性 如果找到了依赖关系后 冒号后面的文件还是不存在 这样的话make也不会工作
在重新产生一个可执行程序时 都应该将之前生成可执行程序以及生成的文件进行清理 即项目是需要清理的
项目清理
make clean命令是用来清除所有的目标文件 以便重新编译 像清除这种没有被第一个目标文件直接或间接关联 那么他后面所定义的命令将不会被自动执行

一般这种clean的目标文件 直接将他设置位伪目标 .PHONY修饰,为目标的特性是可以强制执行


相关文章:
Linux开发工具的使用(vim、gcc/g++ 、make/makefile)
文章目录 一 :vim1:vim基本概念2:vim的常用三种模式3:vim三种模式的相互转换4:vim命令模式下的命令集- 移动光标-删除文字-剪切/删除-复制-替换-撤销和恢复-跳转至指定行 5:vim底行模式下的命令集 二:gcc/g1:gcc/g的作用2:gcc/g的语法3:预处理4:编译5:汇编6:链接7:函…...
MySQL(10):创建和管理表
基础知识 在 MySQL 中,一个完整的数据存储过程总共有 4 步,分别是:创建数据库、确认字段、创建数据表、插入数据。 要先创建一个数据库,而不是直接创建数据表:从系统架构的层次上看,MySQL 数据库系统从大到…...
Python赋值给另一个变量且不改变原变量
Python赋值给另一个变量且不改变原变量 在Python中,如果你想将一个变量的值赋给另一个变量,同时保持原变量不变,你可以使用复制(copy)而不是引用(reference)。Python中的变量通常是通过引用&…...
PHP进销存ERP系统源码
PHP进销存ERP系统源码 系统介绍: 扫描入库库存预警仓库管理商品管理供应商管理。 1、电脑端手机端,手机实时共享,手机端一目了然。 2、多商户Saas营销版 无限开商户,用户前端自行注册,后台管理员审核开通 3、管理…...
npm i 报错:Cannot read properties of null (reading ‘refs‘)
问题: 旧项目要更改东西,重新部署上线的时候,发现页面显示有异常。当时在开发环境是没有问题的。后经排查是一个引入swiper的页面报错了,只要注释掉swiper插件,就没问题了,但这肯定是不行的。 原因: npm和…...
C#学习中关于Visual Studio中ctrl+D快捷键(快速复制当前行)失效的解决办法
1、进入VisualStudio主界面点击工具——>再点击选项 2、进入选项界面后点击环境——>再点击键盘,我们可用看到右边的界面的映射方案是VisualC#2005 3、 最后点击下拉框,选择默认值,点击之后确定即可恢复ctrlD的快捷键功能 4、此时可以正…...
银河E8,吉利版Model 3:5米大车身、45寸大屏、首批8295座舱芯
作者 | Amy 编辑 | 德新 吉利银河E8在曝光后多次引爆热搜,李书福更是赞誉有加,称其为「买了就直接享受」。这款备受瞩目的车型于 10月30日晚首次亮相。 虽然新车外观在今年上海车展上早已曝光,但这次的发布会却带来了不少惊喜。新车架构以及…...
技术分享 | 被测项目需求你理解到位了么?
需求分析是开始测试工作的第一步,产品会先产出一个需求文档,然后会组织需求宣讲,在需求宣讲中分析需求中是否存在问题,然后宣讲结束后,通过需求文档分析测试点并且预估排期。所以对于需求的理解非常重要。 需求文档 …...
[MRCTF2020]你传你呢1
提示 只对php以及phtml文件之类的做了防护content-type.htaccess文件 这里就不整那么麻烦直接抓包测试 首先对后缀测试看过滤了哪些 (php php3 pht php5 phtml phps) 全部被ban了 到这里的后续思路通过上传一些配置文件把上传的图片都以php文件执行 尝试上传图片码, 直接上传成…...
一些对程序员有用的网站
当你遇到问题时 Stack Overflow:订阅他们的每周新闻和任何你感兴趣的主题Google:全球最大搜索引擎必应:在你无法使用Google的时候CSDN:聊胜于无AI导航一号AI导航二号 新闻篇 OSCHINA:中文开源技术交流社区 针对初学…...
小程序使用echarts(超详细教程)
小程序使用echarts第一步就是先引用到小程序里面,可以直接从这里下载 文件很多,我们值下载 ec-canvas 就好,下载完成后,直接放在pages同级目录下 index.js 在我们需要的页面的 js 文件顶部引入 // pages/index/index.js impor…...
js控制输入框中的光标位置
主要逻辑 主要应用selectionStart、selectionEnd来实现 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title…...
Openssl生成证书-nginx使用ssl
Openssl生成证书并用nginx使用 安装openssl yum install openssl -y创库目录存放证书 mkdir /etc/nginx/cert cd /etc/nginx/cert配置本地解析 cat >>/etc/hosts << EOF 10.10.10.21 kubernetes-master.com EOF10.10.10.21 主机ip、 kubernetes-master.com 本…...
Go语言实现数据结构栈和队列
Go语言实现数据结构栈和队列 1、栈 package mainimport "fmt"func main(){// 创建栈stack : make([]int, 0)// push压入栈stack append(stack, 10)// pop弹出v : stack[len(stack)-1]// 10fmt.Println(v)stack stack[:len(stack)-1]// 检查栈空// truefmt.Printl…...
【vscode】Window11环境下vscode使用Fira Code字体【教程】
【vscode】Window11环境下vscode使用Fira Code字体【教程】 文章目录 【vscode】Window11环境下vscode使用Fira Code字体【教程】1. 下载Fira Code字体2. 安装Fira Code字体3. 配置vscode4. 效果如下Reference 如果想要在Ubuntu环境下使用Fira Code字体,可以参考我的…...
Sandcastle生成文档
下载: https://github.com/EWSoftware/SHFB/releases 使用Sandcastle生成Api文档需要使用对应程序集的注释xml 程序集dll作为数据源,通过对xml dll数据解析生成文档;所以主体步骤如下: 程序集资源生成创建配置.shfbproj项目编译构建文档 …...
P1368 【模板】最小表示法
题目描述 小敏和小燕是一对好朋友。 他们正在玩一种神奇的游戏,叫 Minecraft。 他们现在要做一个由方块构成的长条工艺品。但是方块现在是乱的,而且由于机器的要求,他们只能做到把这个工艺品最左边的方块放到最右边。 他们想,…...
【Hive】内部表(Managed Table)和外部表(External Table)相关知识点
在Hive中,有两种类型的表:外部表(External Table)和内部表(Managed Table)。它们在数据存储和管理方式上存在一些重要的区别。 本文就来对这些知识做一个总结。 1、如何在hive中创建内部表和外部表? 2、内部表和外部表的一些区别。 3、怎么查看一个表是内部表还是外部表…...
算法通关村第十四关白银挑战——堆的经典算法题
关注微信公众号:怒码少年。 回复关键词:【电子书】,领取多本计算机相关电子书 大家好,我是怒码少年小码。 今天开始进入新的篇章——堆!这里我默认了大家都知道堆的基本知识了,我们来看看关于堆的两道高频…...
selenium自动化测试入门 —— python unittest单元测试框架
unittest又名PyUnit, Python单元测试框架(The Python unit testing framework),简称为PyUnit。自从 Python 2.1 版本后,PyUnit成为 Python标准库的一部分。 为什么需要使用unittest单元测试框架? 当我们写…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...
永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器
一、原理介绍 传统滑模观测器采用如下结构: 传统SMO中LPF会带来相位延迟和幅值衰减,并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF),可以去除高次谐波,并且不用相位补偿就可以获得一个误差较小的转子位…...
实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
DBLP数据库是什么?
DBLP(Digital Bibliography & Library Project)Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高,数据库文献更新速度很快,很好地反映了国际计算机科学学术研…...
