初识Linux基础工具之yum vim gcc gdb git以及简单makefile文件的编写
文章目录
- 前言
- 1.Linux 软件包管理器 yum
- 2.vim编辑器
- 1.vim模式切换
- 2.不同模式的使用
- 1.底行模式常用操作
- 2.命令模式
- 3.vim的配置文件
- 3.gcc/g++编译器
- 1.预处理指令
- 2.编译指令
- 3.汇编
- 4.动静态库的概念
- 4.make与Makefile
- 5.关于缓冲区的补充知识
- 6.git的常规使用
- 7.gdb调试器
- 8.总结
前言
本文将会对Linux中的一些基础工具进行讲解,熟悉这些工具的使用可以让我们在实际开发中的效率大大提高。由于本人水平有限,本文算是入门篇,可能不会面面俱到,请见谅。
1.Linux 软件包管理器 yum
在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过软件包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装.软件包和软件包管理器, 就好比 “App” 和 “应用商店” 这样的关系.yum(Yellow dog Updater, Modified)是Linux下非常常用的一种包管理器. 主要应用在Fedora, RedHat, Centos等发行版上。
下面是yum的常用指令
yum list | grep 后跟软件包名
(在yun中搜索想安装的软件包的相关消息)
yum -y install 后跟软件名 (安装软件)
yum -y remove 后跟软件名 (卸载软件)
关于 yum 的所有操作必须保证主机(虚拟机)网络畅通!
可以通过 ping 指令验证,比如:ping www.baidu.com
安装软件时由于需要向系统目录中写入内容, 一般需要 root权限才能完成.
yum怎么知道我们要下载的软件在哪里呢?
yum有自己的配置文件,yum源,yum源中有相关软件的链接
基础yum源配置链接一般都是来自于国内镜像源,如果你想更改当前的镜像源,也是可以的。可以百度自行配置,当然配置之前肯定是要将之前的yum源备份一份。
2.vim编辑器
在谈及vim之前,我们先了解一个概念集成开发环境(IDE)。简单来说集成开发环境通过将程序编辑、构建、测试和打包等功能结合到一个易于使用的应用程序中。我们常常使用的vs的就是集成开发环境,我们vs下可以实现对程序的编写,调试,编译等等。但是在Linux中基本没有集成开发环境,编写程序,编译程序,调试程序,都是用不同的工具分开来执行的。vim就是Linux中一款小而美的编辑器,我们可以在vim下进行代码的编写。
Vim是从vi发展出来的一个文本编辑器。其代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用,和Emacs并列成为类Unix系统用户最喜欢的编辑器。
1.vim模式切换
vim是多模式编辑器,我将介绍vim最常用的3种模式,正常/普通/命令模式(Normal mode),插入模式(Insert mode),末行模式(last line mode)。
正常/普通/命令模式(Normal mode)
控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode。
插入模式(Insert mode)
只有在Insert mode下,才可以做文字输入。该模式一般是用的最频繁的编辑模式。
末行模式(last line mode)
文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。
当我们进入vim编辑器时,默认是命令模式
进入命令模式后,是不能进行编辑操作的,要切换成插入模式,按i
即可进入插入模式
进入插入模式后,可以看到下方出现了插入的英文单词
从插入模式回退到命令模式中,按Esc
键即可。从命令模式进入到底行模式按shift 加上;号,也就是:号即可。
进入底行模式后下方会出现一个冒号,如果想回退到命令模式,按ESc即可。
简单总结
2.不同模式的使用
1.底行模式常用操作
在进入插入模式后即可进行文件的编辑或者代码的编写。当要保存退出时,需要切换到底行模式,
输入wq,w意思是写入,q是退出,wq就是保存退出
。
输入wq!表示强制退出.
在底行模式中输入一些特定的指令会有不同的效果
set nu 会显示行号,set nonu,不显示行号。
如果想输入命令行指令,但是不想退出vim,可以在底行模式下输入
!指令
在底行模式下还可以进行关键字搜索和关键字替换
/关键字
进行搜索
%s/关键字/要替换的字符
进行替换
在底行模式下还可以同时打开两个文件分屏操作,输入
vs 文件名
。
2.命令模式
进入vim时默认是处于命令模式下的,在命令模式下可以使用一些类似于Windows中的快捷操作。
复制粘贴
yy 复制当前行,nyy 复制从当前行开始往后的n行。
当前行是以光标指向为基准的,n是数字。
p 粘贴一行 np 从当前光标开始粘贴n行
撤销
u撤销刚刚的操作,ctrl 加 r表示对撤销进行撤销。
剪切(删除)
dd对当前光标所在行进行剪切 ; n dd进行多行剪切,如果只是dd或者ndd就是删除操作
shift g 将光标定位在文档最后一行
gg 将光标定位在文档第一行
n shift g 将光标定位到指定行
shift 4 将光标从当前位置移动到当前行的末尾
shift 6 将光标从当前位置移动到当前行的开头
以单词为单位光标从起始处向前移动或者向后移动 nw向后移动,nb向后移动。
shift~对光标指向的字符进行大小写切换
nr +指定字符 将从光标开始往后的n个字符都替换成指定字符
nx 在行内从光标位置开始向右删除n个字符
nX 在行内从光标位置开始向左删除n个字符
3.vim的配置文件
在目录 /etc/ 下面,有个名为vimrc的文件,这是系统中公共的vim配置文件,对所有用户都有效。
而在每个用户的主目录下,都可以自己建立私有的配置文件,命名为:“.vimrc”。建立好之后可以百度搜索vim配置,将配置指令写入.vimrc文件中。这样就可以使得vim用起来更舒服一点。
补充一点使用sudo进行指令提权
之前说过,想要使用root的权限需要切换到root用户下,除此以外还可以使用sudo指令对单条指令进行权限提升,在使用sudo命令之前,需要root用户将该普通用户添加到信任列表中。
用vim 先打开/etc/sudoers 文件
找到这一行 ,先将root一行复制,之后将root改成要添加的普通用户名即可
然后按wq!
保存强制退出。
这样就可以使用sudo指令进行命令提权
t1.txt文件普通用户没有读权限,使用sudo指令提权后输入当前用户的密码后就可以查看文件了。
3.gcc/g++编译器
在Linux下gcc/g++是常用的C/C++编译器。在谈及编译器的使用之前,先了解一下C/C++程序大致的编译过程。在C语言的博客中就提到过这个话题,程序大致的执行过程就是
预处理
编译
汇编
连接
我们知道gcc t.c,可以直接将t.c编译成可执行程序,这中间经历了预处理,编译,汇编,gcc t.c就相当于是将前3个流程执行的结果进行最后的操作也就是链接。在gcc中可以用对应的指令将预处理 编译 汇编的结果各自显现出来。
这里先介绍一个额外的指令 -o,这个指令有点像给文件重命名,-o的意思是 文件输出到文件。下面举个例子。
1.预处理指令
预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
指令为-E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
2.编译指令
在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。
-S 编译到汇编语言不进行汇编和链接.
3.汇编
汇编阶段是把编译阶段生成的“.s”文件转成目标二进制文件.
-c 编译到目标文件。
之前提到了Linux中操作系统的不以文件后缀区分文件类型的,对于操作系统来说不关心文件后缀,但是为了规范。我在预处理 编译 汇编的时候都是以它们对应的文件后缀来使用-o指令的。.i对应预处理文件 ,.s对应编译文件,.o文件对应汇编文件。
4.动静态库的概念
我们知道预处理的时候仅仅是对头文件进行了包含,也就是相当于在代码中声明了库函数,那么库函数的实现放在哪里呢?
这里就涉及到一个重要的概念那就是函数库。这些库函数的实现都在函数库中,这个函数库分为动态库和静态库两种形式。库也是一种文件.
在Linux中,静态库一般的形式是libxxxxx.a 动态库的一般形式是libxxxx.so,以Linux为例系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现库函数,而这也就是链接的作用。
在Linux中一般默认使用的动态库。
动静态库链接方式
静态库专门让编译器对用户程序进行静态链接,
链接的时候找到静态库将我们所需要的代码从静态库拷贝到代码中,一旦链接成功后,我们的程序不需要依靠任何库,可以独立运行。
动态库专门让编译器对用户进行动态链接,链接的时候找到动态库将我们所需要的代码的地址拷贝到可执行的程序中对应的相关位置,链接成功后,程序还是依赖动态库,一旦动态库缺失我们的程序就不能正常运行。
下面我将举个简单的例子来谈谈对静动态库的理解
假如我们家里没电脑,只能去附近的网吧上网。只要我们记住网吧的地址,想上网的时候直接去就行了。但是某天网吧关门了,哪怕记得网吧的地址还是不能上网。之后,我买了一台电脑放在家里,不管网吧开不开门都不影响我正常上网。
网吧就相当于动态库,家里的电脑相当于静态库。动态库能够做到和所有人共享,库函数的真正实现永远在库中,程序内部只有地址比较节省空间。静态库,因为自身要拷贝代码,比较浪费空间。
程序最后的执行的过程链接就是将形成的.obj文件和库文件进行合并形成可执行程序。
4.make与Makefile
会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。
我们先来看一个make的小demo
使用make必须先建立makefile文件或者Makefile文件。之后根据makefile文件语法规则编写该文件。makefile文件大致分为两部分,依赖关系和依赖方法。依赖关系以上图为例 makefile是目标文件,目标文件依赖与test.c。如果test。c文件不存在,make会往下查找,如果查找不到,就会报错。关于查找的方式我下面将会举例介绍。依赖关系下面就是依赖方法。也就是最后要执行的指令。正确的依赖的关系加上正确的依赖的方法才能执行make。
当使用make时,make会默认执行第一个目标文件,如果想执行其他的目标文件需要在make后面跟上目标文件名。
关于make的查找
这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理,make只管依赖性。
关于make的依赖性就介绍到这里了,之前例子中有个.PHONY:clean
这个是声什么意思呢?
这个是makefile语法修饰词,意思是clean这个目标文件总是被执行。我们来看个例子
这是为什么呢?
这里要介绍两条程序的时间线,一条是源代码完成的时间,另一条是生成可执行程序的时间。当我们使用make时,会对两个时间作对比,以上述例子为例当我们第一次执行make时会执行makefile文件,当我们再次执行make时,原先生成的可执行的程序的时间是比源代码的时间要晚的,就会提示当前的makfile文件是最新的。如果想要再次执行,要么修改源代码,要么加上对clean的那条修饰语来修饰makefile文件。
对已有的文件使用touch指令会改变文件的创建或修改时间
5.关于缓冲区的补充知识
缓冲区的概念之前的C语言中就有提到过,接下来我们将通过缓冲区的概念写个小demo.
这里先谈谈两个转义字符 \r \n,n 是换行回车表示使光标到下一行的行首; \r 是回车表示光标到本行行首。
我们平时敲下的回车键其实是包含了两个动作,到一下行和回到行首。
我们先看看两个例子
第二个示例为啥会这样呢?看起来好像是实现执行sleep然后打印hello,其实这是因为在执行sleep期间hello是被保存在缓冲区,没有被刷新出来。当程序结束后hello就被刷新出来了,所以才会有这样的错觉。在第一个例子中使用了\n,hello可以被刷新出来。
我们在做个小demo 在屏幕上显示倒计时
输入内容都是从光标处开始的,r让光标内次回到行首,就会在同一个位置输处数字,效果就和倒计时类似。还有一点凡是在屏幕上打印的东西都是字符,以整型123为例,printf向屏幕输出123,实际上是将123转化成字符在输出到屏幕。
利用缓冲区刷新覆盖可以实现一个进度条的小demo。当然如果想实现更花哨的功能的可以百度c语言背景颜色设置,让进度条更好看。
6.git的常规使用
Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。
下面我将以gitee新建仓库为例,如何将远的仓库和本地相关联,以及如何操作向远端提交删除代码文件
首先在gitee上新建一个仓库
如果没有gitee账号需要自己注册一个账号,新仓库创建的时候只能为私有,创建好仓库后,可以点击仓库右上方的管理设置成开源。
检查当前机器上是否安装了git,如果没有可以使用yum进行安装。
git --vresion 查看git版本号 检查是否安装git
sudo yum -y install git 安装git
对于第一次使用git的机器需要配置用户信息,让git标示识别以便于管理远端仓库。
配置用户名
git config --global user.name "用户名"
配置用户邮箱
git config --global user.email "电子邮箱地址"
这是以我刚新建的仓库为例
电子邮箱就是注册gitee账号时所填的
查看配置信息
git config --list 查看用户配置信息
配置好信息后,我们选好一个合适的位置新建一个空目录,用来存放后面克隆下来的仓库。
mkdir 目录名 新建一个目录
cd 目录名 进入当前路径下的mydir目录
进入新建的目录后直接将将远端的仓库克隆当前路径下
git conle "仓库地址"
在仓库下有个克隆的地方,点击此处复制,这就是仓库地址
通过ll指令可以查看到克隆下来的仓库目录
克隆之后,对本地仓库进行初始化。初始化的时候一定要进入刚刚克隆下的仓库。
git init 初始化仓库
下面将演示代码的提交
我先将之前写的进度条代码都拷贝到当前本地仓库路径下
我们本地的仓库其实是一个.git目录,通过这个目录来操作远端的仓库
接下来就是提交的三板斧
add commit push
git add . 将当前路径下没有添加到本地仓库的文件都添加到本地仓库
这个添加并不是真正的添加 是把文件放在一个暂存区的地方,我们还需要使用commit指令
git commit -m "简单备注一下提交的文件是干什么的"
到这里才算真正把代码提交到了本地仓库 ,commit -m的备注是不能乱写的这是可以溯源的,要简言意骇。
最后一步就是用push指令将本地的仓库的代码提交到远端仓库
git push 推送文件到远端
推送的时候会提示输入gitee账号和密码
到了这里代码的提交就完成了,接下来就是代码的删除
代码的删除也是需要commit和push的,我们先将文件删除。
git rm main.c 删除main.文件
查看当前目录下文件信息状态
git status
然后就是commit 删除本地仓库中的文件
git commit -m "删除main.c"
push远端推送
git push
查看一下远端仓库
git还能查看提交日志,所以之前说提交的备注不能随便乱写,也不能随便操作仓库
git log 查看日志
最后介绍这怎么删除远端的仓库
先点击管理然后点击左侧的删除,然后会弹出删除的提示,点击删除仓库,删除的时候需要输入账号密码,本地的仓库直接删除即可
7.gdb调试器
程序的发布方式有两种,debug模式和release模式。Linux gcc/g++出来的二进制程序,默认是release模式,
要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项
下面我将新建一个C语言程序用于演示
当生成debug版本的可执行程序后,gdb 后跟文件名即可进入调试。
进入调试后,可用l 加空格1表示从代码第一行开始显示,gdb默认显示10行,按回车继续显示。
查看指令不影响当前调试的位置
打断点 :断点breakpoint ,用首字母表示b表示断点,b后面可跟行号 或者函数名 ,也可指定文件
info b 表示查看断点信息,其中断点比编号是依次累加了,如果我将上述三个断点删掉,打下第四个断点,断点编号是4,除非将gdb关闭再进入gdb调试断点编号才能从1开始。
取消断点 d 后跟断点编号,取消指定断点。
断点使能:保留断点但是不让程序在该断点处停下
disable breakpoint 断点编号
这就相当于断点存在,但是断点不生效
想要再次开启断点,使用指令enable berakpoint 断点编号
r指令运行程序,r的意思是run。当在调试时无断点时,输入r程序会就直接运行输出结果。如果有断点将会运行到最近的断点处。
n逐过程调试,遇到函数不会进入函内部。相当于vs中的f10
s逐语句调试,遇到函数会进入函数内部。
查看变量使用p指令 ,display&变量长显示 类似vs监视,取消长显示 undisplay 编号。until 行号:在函数体内,进行指定位置跳转,执行完区间代码
进入函数内后使用finish指令,直接执行到当前函数并返回,然后停下来等待命令。
可以看到finish之后,直接输出了函数返回值,然后按n,直接往函数调用的下一行走了
c:从一个断点处,直接运行至下一个断点处。
bt指令查查看各级函数调用及参数
set var 设置条件 使程序运行至指定步骤,比如设置 set val sum =6,程序就会运行至sum 为6的时候。
最后补充一点,如果想要退出gdb 输入q
即可
8.总结
- 1.以上内容如有问题欢迎指正!
- 2.上述工具需要多加练习才能熟练使用!