目录
apt/yum
介绍
常用命令
install
remove
list
vim
介绍
常用模式
命令模式
插入模式
批量操作
底行模式
模式替换图
vim的配置文件
gcc/g++
介绍
处理过程
预处理
编译
汇编
链接
库
静态库
动态库(共享库)
make/Makefile
介绍
Makefile
Git
介绍
Git使用
git clone
git status
git log
git add
git commit
git push
git pull
gdb/cgdb
介绍
使用
apt/yum
介绍
apt和yum都是软件包管理器,apt是Ubuntu的,yum是CentOs的。它可以主动帮我们解决包的依赖问题。它是通过内置链接来实现下载软件包的。
软件包管理器就相当于是手机上的应用商店,而软件包就类似于App。
常用命令
install
安装软件包,yum/apt install 软件包名,在软件包名前加 -y 会不在询问我们是否执行该操作,而是直接执行(下面也一样)。注意:普通用户要下软件要用sudo。
sl是一个有趣的命令,它会生成一个小火车:
remove
删除软件包,yum/apt remove 软件包名。
当删除后可以用--version来查看是否存在。
list
查找软件包,yum/apt list 软件包名,软件包有很多如果直接找的话,工作量会很大,可以利用grep来查找。
vim
介绍
vim是一个文本编辑器,vim是多模式的编辑器,其中常用的有命令模式,插入模式,底行模式。当我们打开vim时默认是命令模式。
进入vim只需要vim 普通文件名即可。在打开vim时可以用:vim 文件名 +n,即可直接让光标在第n行。如果没有普通文件名会先创建一个然后在进入。
常用模式
命令模式
该模式可以使用各种命令来对文本进行操作。
下面是命令模式中光标移动的常用命令:
- gg:定位到开头
- G:定位到结尾
- nG:定位到第n行
- ^:定位到行头
- $:定位到行尾
- h:向左移动,相当于←
- j: 向下移动,相当于↓
- k:向上移动,相当于↑
- l: 向右移动,相当于→
- w:以单词为单位向后移动
- b:以单词为单位向前移动
补充:6,7,8,9,10前均可加n,表示一次移动n行。
10、11演示:
现在光标在p处按一次w会到
,如果这时按b回到p处
,如果是2w就是移动两个单词,所以会到h处
下面是命令模式中其它的常用命令:
- yy:复制当前行
- p:光标所在位置进行粘贴
- dd:剪切或删除当前行
- x:删除光标右边的内容
- X:删除光标左边的内容
- r:替换光标所在位置字符
- R:批量化替换
- ~:光标所在位置字母的大小写替换
- u:撤销历史操作
- ctrl + r:反撤销
补充:1,2,3,4,5,6前均可加n,前三个表示一次操作n行,后面的表示一次操作n个长度。7会直接进入替换模式,替换模式简单来说就是你在键盘上按的键都会替换光标所在位置字符,替换一个光标默认向后移动。Esc即可退出返回到命令模式。
下面是命令模式中查找的常用命令:
- #:自动选择光标所在位置单词
- n:从下向上找
比如说现在有三个printf函数,
当你输入#后如下:
输入n会向上查找
插入模式
该模式是用于输入和修改文本内容的模式。输入i进入该模式,Esc退出该模式并返回到命令模式。
批量操作
在命令模式中用Ctrl + v进入V-BLOCK模式,然后用h、j、k、l选取范围,然后输入I进入插入模式,然后把范围的第一行写入要操作的内容,最后点Esc返回命令模式即可实现批量操作。
先用Ctrl + v进入V-BLOCK模式,在左下角会有模式名字
然后用h、j、k、l选取范围
然后输入I进入插入模式
然后输入要批量操作的内容
最后Esc返回命令模式,即可将剩余的选取范围都给操作掉
批量删除就和上面差不多,只是到选完区域后,按d键即可,并且会回到命令模式。
底行模式
该模式用于执行一些需要输入命令或参数的操作。输入 : 进入该模式,Esc退出该模式并返回到命令模式。
下面是底行模式的常用命令:
- wq!:强制保存退出(w保存,q退出,!强制)
- ! 命令:执行外部命令(在shell外壳中,!加指令的首字母将会自动执行最近的一次以该字母开头的指令)
- %s/old/new:把文件里的old都给替换成new
- / 单词:在文件里正向查找该单词
- ? 单词:在文件里反向查找该单词
- vs 文件名:新建或打开该文件,用Ctrl + ww切换不同文件
2演示:
在vim中:
在shell外壳中:
3演示:
6演示:
因为我的目录里没有tt.c所以会新建一个tt.c,光标默认在tt.c里。
如果想把光标给移到test.c里就要用到ctrl + ww
可以看到光标确实到了test.c里了。
模式替换图
vim的配置文件
vim的配置需要有.vimrc,如果没有就需要我们自己提供一个,他是给vim提供各种配件的例如:设置行号、自动补全等。大家可以自己去网上查查。
gcc/g++
介绍
gcc/g++是编译器,gcc用于编译C语言,g++用于编译C++。
处理过程
预处理
本质上是修改我们的代码比如:删注释,宏替换,头文件展开等。
可以用下面的指令来实现生成预处理之后的文件:
gcc -E test.c -o test.i。其中-E是告诉编译器预处理完之后停下来,-o 选项用于指定输出文件的名称。如果没有-o test.i它会默认生成一个与源文件名字相同后缀不同的文件。
编译
经过编译之后会将代码变成汇编代码,之所以变汇编代码是因为语言发展的历史原因决定的,是先有汇编再有其他的高级语言。
gcc -S test.i -o test.s。-S是告诉编译器编译完之后停下来。
汇编
经过汇编之后会生成目标文件里面的内容是二进制,但是这时的二进制文件还不能直接执行。
gcc -c test.s -o test.o。-c是告诉编译器汇编完之后停下来。Linux中的目标文件后缀是.o,Windows是.obj。
链接
把.o文件给链接起来,并让程序在库中找到对应方法的地址,最终生成可执行文件。
最后./code即可运行程序。
大多数情况下不会像上面一样而是首先生成目标文件,然后再统一链接,这么做可以提高编译效率并且提高文件复用。
库
库里面的文件一般也都是目标文件,库分为静态库和动态库。
静态库
后缀在Linux下是.a,Windows下是.lib。直接在库里拷贝一份到你的程序里,但体积大,浪费资源。
动态库(共享库)
后缀在Linux下是.so,Windows下是.dll。需要跳转到库里去执行(通过在链接中找到的地址),库一旦缺失就会使程序无法运行,体积小,库里面的函数只会在内存中出现一次。
make/Makefile
介绍
make是自动化构建工具。它通过读取特定的配置文件(Makefile,M/m均可),根据其中定义的规则来自动执行相应命令,从而实现对软件项目的自动化构建。
Makefile是一个文本文件,用于告知make工具如何构建项目。它包含一系列规则,明确了目标文件、这些目标文件依赖文件以及生成目标文件所依赖的命令。
Makefile
Makefile文件默认是没有的,需要我们在当前目录自己提供一个,下面是规则格式:
目标文件:依赖文件(依赖关系)
依赖方法
依赖方法前面要加一个TAB键!
要构建项目时只需要make目标文件,如果目标文件是Makefile的第一个目标文件那就可以不写目标文件。
.PHONY是用于定义伪目标。具体如下:
被它修饰的目标文件可以多次make,因为make之后如果依赖文件没有修改就不会重新编译。它只会对修改的文件做重新编译并不会全部编译。
可以看到多次make并没有什么问题,那要是code呢?
可以看到给出了提醒
判断是否修改是通过查看文件的Modify的时间(记录内容修改时的时间)来确定的,如果.c的M要新于.exe的M那就会进行重新编译。补充:文件的时间属性还有Access和Change其中Access是记录查看文件的时间(到达一定的次数才会改变),Change是记录文件属性修改的时间(它和Modify几乎是同时改变的,因为内容的修改就会改变大小,时间等)。可以通过stat来查看文件的属性。
在Makefile里可以定义变量类似于宏,$(变量名)类似于解引用。
大家可能发现了上面的红框里这是自动打印的依赖方法,可以用@隐藏。
$@:表示目标文件,$^:表示依赖文件列表。
%.o:%.c,它是一种规则模式,它表示所有的.o文件都可以通过.c文件来生成,本质上就是一个一个展开,%类似于通配符。
$< 是一个自动变量,它代表规则中的第一个依赖文件。例如,在规则 code.o: test.c tt.h中, $< 就代表 test.c 。
当前目录所有源文件可以用SRC=$(shell ls *.c)或者SRC=$(wildcard *.c)来拿到。定义目标文件可以OBJ=$(SRC:.c=.o)这是一种变量替换语法。它的作用仅仅是生成一个目标文件列表,#是注释。
总体浏览:
通过上面的操作我们就可以了很方便的构建项目,虽然现在看不出来但要是等文件多起来的时候就会变得巨方便。
Git
介绍
Git是版本控制器,它用来进行版本控制,简单来说,就是对项目中的文件、代码等内容的变更进行记录、管理和追踪的系统。同时支持多个开发者进行协作开发项目。
使用Git可以将代码存在本地或远端,Git允许从远端推送到本地,从本地拉取到远端。一般将代码上传到远端仓库,这样可以方便团队协作,仓库其实就是一个文件夹。像gitee和github就是基于git开发的网站或平台(远端)。
Git还是去中心化,分布式的版本控制,即没有中心控制节点,系统中各节点地位平等,数据、任务或功能分散在多个不同节点上。
Git使用
git clone
后面接远端仓库链接,用于克隆(复制)远程仓库到本地的,会新增一个文件该文件叫工作区也是本地仓库,进入该工作区用ll会看到.git这就是实际仓库。
在我的目录里,linux-learning就是我的工作区。
git status
用于查看Git中用于查看当前工作目录和暂存区状态的命令。
git log
用于查看提交历史记录。
git add
后接要上传的文件,这里只是将文件放在了暂存区,这些文件的修改就会被Git跟踪,等待后续使用git commit命令提交到本地仓库的版本历史中。
注意:Git只会记录修改部分的变化!
git commit
后接 -m "",双引号里的内容一定要是有意义的。之后暂存区的文件就会被上传到本地仓库里。
git push
将本地的文件上传到远端仓库。
可以看到确实在远端仓库确实多了一次提交
git pull
当远端仓库的文件跟本地不同步时才要pull的,用于将远端仓库的文件拉取到本地仓库,也就是同步远端仓库。当同步后在add、commit、push。
gdb/cgdb
介绍
gdb是调试工具,主要用于调试C、C++等编程语言编写的程序。cgdb是一款基于gdb的图形化调试工具,为开发者提供了更直观、高效的调试体验。
安装cgdb
Ubuntu:apt-get install -y cgdb
Centos:yum install -y cgdb
在Linux中用gcc/g++编译好的程序,无法直接调试,因为默认的工作模式是release,要在编译时gcc/g++后加-g(相当于是添加调试信息)才是debug模式。gdb/cgdb后要接可执行文件。
使用
下面是常用命令:
- l:查看源代码,后面可以接行号,表示要查看第几行的源码
- b:打断点,有三种打法:1.b 文件名:行号、2.b 文件名:函数、3.b 行号
- info b:查看断点信息
- d:删除断点,后面只能接断点编号不能接行号,只要你不退出cgdb,编号会一直向后线性递增
- r:从头运行程序或到下个断点,即使程序结束在输入r之后会再次从头开始运行程序至遇到断点或结束程序。
- n:逐过程,不进函数里
- s:逐语句,进函数里
- quit:退出调试器
- bt:查看栈帧
- finish:直接执行到函数结束(return语句之后)
- p:后可以接变量或表达式,用于查看值
- disable:后接断点序号,用于忽略断点
- enable:后接断点序号,用于启动断点
- c:从该断点运行到下个断点
- until:后接行号,用于跳过循环到指定行号(并非跳过而是执行完循环)
- display:后接变量,用于监视变量
- undisplay:后监视变量序号,用于取消监视变量
- info locals:查看函数里所有临时变量
- watch:后接变量,当该变量改变时会告诉你
- set var:后接变量=值,给变量赋值
- 条件断点:即满足某一条件时才会被执行。1.新增断点:b 行号 if 判断语句、 2.对已有断点添加条件:condition 编号 判断语句
使用cgdb时输入Esc到代码处可以上下翻动,输入i回到原来的地方。
10演示:
当我输入后:
15演示:
当我输入后:
上面我所介绍的开发工具一定要自己上手练习!!!