软件包管理器yum
Linux有两种方法安装软件,一种是直接下载源代码,编译后得到可执行程序,比较麻烦。于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上,通过包管理器可以直接安装这个编译好的软件包。软件包和软件包管理器,就好比 "App" 和 "应用商店" 这样的关系。yum(Yellow dog Updater, Modified)是Linux下非常常用的一种包管理器。
yum语法
查看软件包
通过yum list命令可以罗列出当前一共有哪些软件包.由于包的数目非常多,这里我们使用 grep 命令只筛选出我们关注的包。例如yum list | grep vim

安装软件
t通过"sudo yumintall 软件名称"安装软件,sudo可使当前用户临时获得root权限执行当前语句,如果是root用户,不需要使用sudo。此外当前用户需被列入白名单中方可使用sudo
常用选项:-y 安装无需确认,直接安装
如果显示"nothing to do"就说明该软件已经安装并更新至最新版本。

vim开发工具
Vim 是一个终端文本编辑器 ,是 Vi 的增强版,无图形界面,全键盘操作,广泛用于 Linux 编程和系统管理。
使用vim+文件名进入vim编辑界面,如下图所示

三种模式介绍及切换
vim的三种基本模式分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:
1.命令模式控制屏幕光标的移动,字符、字或行的删除。
2.在插入模式下才可以做文字输入。在命令模式下,shift+i 即可进入该模式。按「ESC」键可回到命令行模式。该模式是最频繁的编辑模式。
3.末行模式负责文件保存或退出 ,也可以进行文件替换,找字符串,列出行号等操作。 在命令模式下,"shift+:" 即可进入该模式。按「ESC」键可回到命令行模式.
让vim编辑器操作更加方便
vim编辑器如果不去配置挺难用的,如果要做成vs那种非常丝滑的效果,可以按照别人的教程进行配置,这里不再赘述。
gcc编译工具
GCC 是 Linux 下最常用的编译工具,是 将源代码(.c/.cpp)转换为可执行程序的工具链。
背景知识:编译的基本步骤
-
预处理(进行宏替换)
-
编译(生成汇编)
-
汇编(生成机器可识别代码)
-
链接(生成可执行文件或库文件)
gcc使用语法
1.直接将源文件编译成可执行程序:
格式 gcc [选项] 要编译的文件 [选项] [目标文件]
下面演示将main.c编译成kkk文件,-o选项是将编译好的kkk文件直接输出到当前文件夹中,可以看到当前路径多了个已经编译好的kkk,用./kkk直接运行


2.按照前述编译基本步骤分步编译
使用-E选项对main.c进行预处理并停止编译过程,使用-o选项输出已进行过预处理的main.i文件(预处理)

使用-S选项对main.i进行编译,使用-o选项输出已生成汇编的main.s文件(编译)

使用-c选项对main.s进行编译,使用-e选项输出已生成汇编的main.o文件(汇编)

最后将main.o文件生成可执行文件(链接)

.o文件是怎么和库连接的?
链接有两种方式:静态链接和动态链接
动态链接是指在编译链接时,不将库代码复制到可执行文件中 ,而只是在可执行文件中记录对库的引用信息。程序运行时根据这些引用信息动态加载库代码并执行
静态链接是指在编译链接时,将库文件中被程序调用的代码直接复制到最终的可执行文件中。这样生成的可执行程序不再依赖外部的库文件,运行时所有代码都已包含在内
如果采用动态链接的方法,程序运行时**需要依赖外部的库文件(.so)**如果目标系统缺少特定版本的库,或者库路径配置错误,程序就会启动失败
而静态链接完全不依赖动态库,因为可执行程序里面已经打包好了所有需要的库代码,但这种方式内存占用大
gcc编译时默认进行动态链接,使用gcc编译时添加"-static"选项即可强制进行静态链接
Linux项目自动化构建工具make和Makefile
如果有大批量文件需要编译,一个个手动编译过于繁琐,通过make指令和makefile文件批量编译或清空文件
使用make的时候会自动查询当前路径下名为makefile的文件并执行里面的内容,关于makefile目前 学到以下内容:
首先创建一个makefile文件(不需要后缀)使用vim编辑器打开,写以下代码
第一行结构为 A:B A是目标文件 B是源文件,这里想要达成的目的是将progressbar.c和main.c编译得到progressbar文件
第二行要先空出四格(硬性要求),然后写出第一行的依赖方法------使用gcc指令将progressbar.c和main.c编译得到progressbar并输出
第四行结构为A:B,只是clean不需要源文件,只需要依赖方法------第五行将编译好的progressbar删除,其实就是
第三行的.PHONY是一个修饰词,用于修饰clean,这样子就可以反复清除,至于为什么需要这种修饰后面会讲到
有了上面的类似脚本一样的东西,我们只需在progressbar.c和main.c所在路径下,使用make指令,就会直接生成progressbar !

可以看到make指令使用后,弹出了这条指令调用的依赖方法,同时生成了progressbar的可执行文件,实际上只是使用make默认实现makefile中的第一个目标文件,在此例中是progressbar,由于clean是第二个目标文件,所以如果要实现clean需要使用"make clean"。
如果我们再次使用make,会弹出"progressbar已是最新"的提示
这里衍伸出两个问题:1.系统是怎么知道我的文件是否做过变动,从而得出该可执行程序已经是最新的结论?2.如果我希望可以重复make,我该怎么做?
1.系统判断文件变动时间的方法:
其实判断依据很简单:源文件的修改时间一定要早于可执行程序的修改时间,因为可执行程序是由源文件生成得到的,所以当先有可执行程序时间早于源文件,说明源文件做了修改,所以可以也应该再次使用make重新生成可执行程序。
先前笔记有提到文件=文件内容+文件属性 ,文件属性包含了文件时间,使用"stat+文件名"可以查看时间,一个文件有下面三类时间:
最近访问时间(access)
**最后一次对文件内容操作的时间(modify)**如更改里面的代码
**最后一次对文件属性操作的时间(change)**如更改该文件的权限
系统对"是否能make"的判断正是基于源文件和可执行程序的modify作出的。
2.如何能够重复make而不需要等源文件更新?
其实我们想要的不是重复make这个现象,设想一下,make clean会先检查当前目录下是否有clean(这是准备生成的目标文件),假如当前目录下已经有叫clean的文件,就不会执行makefile里面真正的clean操作了。**使用.PHONY修饰目标文件,**相当于告诉make别管当前目录下有没有同名文件,你只管执行makefile里目标文件的依赖方法即可。
下面示例被".PHONY"修饰目标文件可以反复使用make(不管当前路径下是否有progressbar)

git分布式版本控制系统
git 是一个分布式版本控制系统,用于跟踪文件变更、管理项目历史、支持多人协作开发。使用"yum install git"下载该工具
创建仓库和提交代码的步骤:
创建仓库:
在gitee注册账号,然后点击右上角的+号创建仓库,可以按照下图配置

注意:gitignore是一份包含多个文件后缀的文件,后续上传代码到仓库的时候,系统会自动忽略带有gitignore中后缀的文件,如缓存文件
创建完成后可以看到有如下初始文件(这些文件和前面选择的选项有关)

打开仓库界面点击"克隆/下载"

复制仓库链接

使用"git clone 复制的链接码",将仓库克隆到当前路径,可以看到当前路径下新增了文件,这就是我们创建的仓库

进入仓库可以看到下面白色字体文件,对应网页端看到的仓库初始文件

提交代码三板斧
首先将需要提交的文件拷贝到仓库路径下,这里演示提交test文件,随后使用**"git add "** 待上传的文件名"将需要用 git 管理的文件告知 git,再使用**"git commit -m "** 要填写的日志内容""提交改动到本地,-m选项用于添加日志,一定要带上,日志也不要乱写

最后使用**"git push"** 将文件同步到远端服务器上,此处需要填写git的用户名和密码

注意第一次在linux上使用git时,在commit那一步系统会提示需要配置用户名和邮箱,按提示操作即可
git其它一些功能
**"git status"**检查仓库内是否有文件发生变动,这里提示文件已经都是最新,无需提交

"git log" 查看历史提交日志
gdb调试工具
前文已经讲过如何将源文件生成可执行程序并运行,如果我们想在Linux上调试可执行程序,就得用gdb调试工具,仍然使用yum install gdb进行安装。
值得注意的是,gcc或g++指令默认生成的的可执行程序是release版本的,需带上-g选项才能生成debug版本,然后才能使用gdb进行调试
基本指令
首先要说明的是gdb模式下是会自动记录上一条指令的,直接按Enter键重复上一条指令
进入/退出调试模式
使用"gdb 文件名"进入调试模式,若指令行开头出现[gdb]说明成功进入,不成功可能是编译不通过或该文件不是debug版本的
输入q(quit)来退出调试模式

开始调试
使用 "r "(run)会自动运行到第一个断点,若没有断点会将程序直接运行完
逐语句/逐过程运行:
使用 " s " " n"(step,next)分别实现逐语句和逐过程运行,类似vs上的F11和F10快捷键
展示代码
gdb调试器不会自动展示代码,需要手动使用 "l 行号 " 来展示对应行号上下部分的代码片段,反复按Enter重复同一命令会继续往下展现,直到代码结束
此外,使用"l 函数名 "可展现某个函数的片段;若需要跨文件展示,使用" l 文件名:行号 "或"l 文件名:函数名"可展现另一文件某一行或某一函数的片段

增加/移除/查看断点
使用 " b " (break)来增加断点,使用 "info b " (infomation)来查看所有断点信息,使用"d 断点编号"(delete)删除相应断点断点,和跨文件查看类似,用"b 文件名:行号 "跨文件添加断点
打开/关闭断点:
使用"enable 断点编号 "和"disable 断点编号"打开和关闭断点,这个功能在循环里面好用,因为在循环中的断点,无论是使用逐过程n还是until或finish都没办法跳过循环,需要将循环中的断点暂时关闭才行
控制运行位置有关操作:
"c"(continue):运行到下一个断点,类似vs的F5
"until 行号":直接运行到指定行而忽略断点(已经处在循环中不可跳过)
"finish" :直接运行完当前函数,运行位置跳转回到调用函数的语句
监视/查看/修改变量:
使用"p 变量名 "添加变量监视,如果需要让监视变量保持显示,使用"display 变量名 "让变量常显示,使用"undisplay 变量名"取消常显示
使用 "info local"来显示本地变量(当前函数的所有有关变量,类似自动监视)
使用"set var"来更改变量的值,可用于排查循环时减少循环的次数等场景,例如:set var i = 100
