学习导航

  • 一、软件包管理器yum
    • 1.linux如何进行安装
    • 2.什么是软件包
    • 3.yum如何安装程序
      • (1)原理的感性理解
      • (2)yum常用指令
  • 二、Linux编辑器Vim的使用
    • 1.初步认识
    • 2.Vim命令模式下的批量化操作
      • (1)复制粘贴
      • (2)快速移动
      • (3)修改
    • 3.Vim底行模式下的操作
  • 三、Linux编译器gcc、g++的使用
    • 1.预处理、编译、汇编、链接
    • 2.头文件与库文件
    • 3.静态库与动态库
  • 四、Linux调试器gdb的使用
    • 1.基本概况
    • 2.调试指令
  • 五、Linux自动化构建工具
    • 1.基本概况
      • (1)是什么?
      • (2)什么是依赖方法、关系
      • (3)为什么需要makefile
    • 2.最简单的案例
      • (1)案例演示
      • (2)问题反思
    • 3.伪目标
      • (1)问题引入
      • (2)问题延伸: Linux是如何识别目标文件的新旧的?
      • (3)总结
    • 4.多文件的makefile
  • 六、git的学习使用
    • 1.在Gitee创建仓库
    • 2.克隆项目到本地
      • (1)第一步:确定url
      • (2)第二步:clone
    • 3.Git三板斧
      • (1)第一招:git dd
      • (2)第二招:git commit
      • (3)git push
    • 4.其他
      • (1)git log
      • (2).gitignore
      • (3)git status
      • (4)git pull

一、软件包管理器yum

1.linux如何进行安装

  • 源码安装:下载程序的源代码, 并进行编译, 得到可执行程序

    [缺点]:配置麻烦,对小白不友好

  • npm包安装:

    [缺点]:其依赖的库还需要自己额外安装

  • yum安装

    [优点]:不用编译源码;不用解决软件依赖问题

2.什么是软件包

  • 将一些常用的软件提前编译好,做成软件包(可以理解成windows上的安装程序)放在一个服务器上,通过包管理器可以很方便的获取到这个编译好的软件包,,直接进行安装
  • 软件包和软件包管理器,就好比 “App” 和 “应用商店” 这样的关系
  • yum(Yellow dog Updater,Modified)是Linux下非常常用的一种包管理器。主要应用在 Fedora, RedHat,Centos 等发行版上

3.yum如何安装程序

(1)原理的感性理解

yum就类似于手机上的应用商店,从linux服务器上取拉取我们指定的程序

[提问]:yum是怎么知道去哪些服务器里下的呢?

[答]:Linux里有相应的配置文件。.repo就是一个个yum源了

如果下载程序速度慢或者repo中的网站为外网,那么可以考虑更新yum源。

[注意❗]:做任何配置的时候,都不要直接删除,而是先备份

(2)yum常用指令
  • 搜索

  • 安装

  • 卸载

  • yum makecache:服务器的包信息下载到本地电脑缓存起来
  • yum -y update:升级所有包同时,也升级软件和系统内核
  • yum -y upgrade:只升级所有包,不升级软件和系统内核,软件和内核保持原样

二、Linux编辑器Vim的使用

1.初步认识

  1. 什么是Vim?

    vim是一个功能强大的多模式编辑器,只能用来写代码。各个模式切换如下

    从命令模式到插入模式还有两种方法:

    • o:插入新的一行,从行首开始输入文字
    • a:从目前光标所在位置的下一个位置开始输入文字
  2. 为什么要学Vim?

    有时候,需要我们在生成环境下快速定位问题,甚至快速修改代码

  3. Vim的快速配置

    VimforCpp链接

2.Vim命令模式下的批量化操作

(1)复制粘贴
  1. yy :复制当前行 nyy:复制n行
  2. p:粘贴到当前行的下一行 np:复制n份
  3. dd:剪切当前行 ndd:剪切n行
  4. u:撤销当前操作
  5. ctrl + r:复原操作(针对撤销操作)
(2)快速移动
  1. g + g:光标快速定位到文本最开始
  2. shift + g(G):光标快速定位到文本末尾
  3. n + shift + g:光标快速定位到文本第n行
  4. shift + 4($):光标快速定位到文本行的末尾
  5. shift + 6(^):光标快速定位到文本行的最开始
  6. w,b:向后、向前以单词为单位进行移动
  7. h,j,k,l:左 下 上 右
(3)修改
  1. shift + `(ESC下面):快速大小写切换
  2. r:替换光标所在的字符 n r :替换成n个r
  3. shift + r®:批量化替换
  4. x:删除光标所在字符 nx:删除n个

3.Vim底行模式下的操作

  1. 替换:[range]s / {pattern} / {string} / [flags] [count]

    • range表示范围。%用于表示全文
    • s表示替换
    • pattern 表示字符串匹配规则,即要匹配什么样的字符串
    • string 表示要将匹配到的字符串替换为的新的string字符串
    • [flags] s_flags中,g比较常用,通常使用g表示全部替换,默认如果不给的话,表示只替换一次
    • [count] 表示在一行中匹配多少次
  2. 打印:[range]p[rint] [flags]
    • 用于打印指定区间的行
  3. 退出:
    • q:退出 (q!表示强制退出)
    • wq:保存并退出。就算没有修改也会写入,并修改文件时间属性
    • x: 保存并退出编辑,仅当文件有修改时会保存,并修改文件时间属性

三、Linux编译器gcc、g++的使用

1.预处理、编译、汇编、链接

gcc -E test.c -o test.i   // 预处理
gcc -S test.i -o test.s   // 编译
gcc -c test.s -o test.o   // 汇编
gcc test.o -o mytest      // 包含链接过程

[说明]:

  • -E:从当前文件开始翻译,翻译到预处理完成时停止
  • -o:将生成的文件保存到临时文件test.i中
  • -S:从当前文件开始翻译,翻译到编译过程结束时停止
  • -c:从当前文件开始翻译,翻译到汇编结束时停止

[记忆]:

  • ESc 、 iso

[注意❗]:

g++可以编译C语言代码也可以编译C++代码,而gcc只能编译C语言代码

2.头文件与库文件

  • 头文件为我们提供了可以使用的方法, 开发环境。语法提示也是头文件帮助我们搜索的
  • 库文件为我们提供了可以使用的方法的实现,以供链接形成我们自己的可执行程序

3.静态库与动态库

  1. 动态库:Linux(.so) windows(.dll)
  2. 静态库:Linux(.a) windows(.lib)

[动态库]:

  • 优点:大家共享一个库可以节省空间
  • 缺点:一旦库缺失,会导致几乎所有程序失效

​   一般而言,更推荐使用动态库,Linux系统也是这样认为,所以生成的可执行程序默认都是动态链接。

​  如果想生成静态链接的可执行程序,要加上-static的后缀,但是系统一般没有自带静态库,所以还需要额外安装glibc-static libstdc++-static

​  使用ldd指令可以显示链接属性

四、Linux调试器gdb的使用

1.基本概况

使用 gdb + 文件名即可进行调试了,但是遇到如下错误:

  1. 可执行程序才可调试

【解决】:编译生成可执行程序

  1. 默认生成可执行程序为release版本

【解决】:加上-g选项,生成debug版本下的可执行程序

不难发现,以debug模式发布,因为包含调试信息,体积会更大

2.调试指令

  1. l + 行号:从第n行开始显示 (list)

  2. b+ 行号:打断点 (break)

  3. d+ 断点编号:删除断点 (delete)

  4. info b:显示断点信息

  5. s:逐语句进行 (step)

  6. n:逐过程进行 (nest)

  7. p+ 变量:类似于监视的作用 (printf)

  8. display + 变量名:跟踪某一个变量,每次停下来都显示它的值

  9. undisplay + 变量名:取消跟踪

  10. until+ 行号:跳转到指定行号

  11. r:运行程序 (run)

  12. c: 从一个断点跳到另一个断点 (continue)

  13. finish:执行完一个函数就停下

  14. bt:查看调用堆栈

五、Linux自动化构建工具

1.基本概况

(1)是什么?
  • make 是一条指令,makefile(也可以是Makefile)是一个文件

  • makefile = 依赖方法 + 依赖关系

(2)什么是依赖方法、关系

​ 依赖关系表明,可执行程序的实现依赖哪些源文件

​ 依赖方法表明,源文件是如何生成可执行程序的。依赖关系和依赖方法对于Makefile文件来说缺一不可。

(3)为什么需要makefile

​  在VS下,我们只要写好了头文件和源文件,编译器就在自动帮我们生成可执行程序,我们从来不需要关心各个文件之间是怎样相互链接的,因为编译器已经帮我们完成了项目的构建。

​  如果这个过程需要我们手动完成:对于单个文件的简单程序,一条命令就可以直接搞定了(编译+连接),但是如果是一个复杂的工程,可能有成千上万个文件,然后需要链接大量的动态或静态库。试想一下,你还想一条一条命令执行吗?

​  因此makefile就出现了,它定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,极大的帮助我们完成项目的构建

2.最简单的案例

(1)案例演示

[笔记]:

  1. makefile文件最核心的就是说明依赖关系依赖方法,以上面生成 mytest 文件为例说明:

    • mytest 一行表示 mytest 文件的生成依赖文件 mytest.c
    • gcc 一行指令说明了 mytest 是如何通过mytest.c 生成而来的(gcc编译而来)
  2. 书写makefile文件时要严格注意格式。书写依赖方法时要换行并且按下 tab 键,注意tab键不能用按相应数量的空格来代替,否则会有如下错误

  3. 依赖关系可以为空,例如 clean 的实现不依赖任何其他文件

  4. 有了Makefile文件后我们使用 make 指令就执行相应操作

(2)问题反思
  1. 为什么使用make指令时默认执行生成mytest的代码?

【答】:makefile在形成文件的时候默认自顶向下扫描,默认只会形成第一个目标文件,并执行该依赖关系的依赖方法。

3.伪目标

(1)问题引入

​ 上面例子中出现的.PHONY是什么意思呢? phony在英语中的意思是赝品,即我们创建了一个伪造的目标——clean。

​ 伪目标和真正目标的区别在于,伪目标总是可以被执行

(2)问题延伸: Linux是如何识别目标文件的新旧的?

通过stat指令我们可以获得文件的基础信息,我们对下面的三个时间加以说明:

  • Access:表示读取或进入文件的时间
  • Modify:表示文件内容被修改的时间
  • Change:表示文件属性被修改的时间

​ 由于Access的使用频率最高,所以出于优化的考虑,只有读取或者进入文件达到一定次数才会修改Access的时间

​ 文件内容修改也有可能会改变文件属性,例如文件大小也是文件属性的一种

回到我们最初的问题,Linux是如何判断目标文件的新旧的?

【答】通过比较源文件和目标文件的 Modify 时间来判断

如果目标文件是新的,那么它的修改时间一定在源文件修改时间得到后面

反之,则说明源文件在创建目标文件后发生了改变,即目标文件变“旧”了。

当我们修改源文件后,发现又可以 make mytest

(3)总结

.PHONY修饰的目标文件总是被执行

4.多文件的makefile

​ 前面我们只提到了最简单的makefile,我们现在举一个多文件的例子来帮助大家理解makefile的意义以及输入make指令后所经历的过程:

  • make会在当前目录下寻找名叫 “makefile” 或者 "Makefile"的文件
  • 如果找到,它会找文件中的第一个目标文件(target)。在上面的例子中,他会找到「Add」这个文件,并把这个文件作为最终的目标文件
  • 如果目标文件所依赖的文件并不存在,那么Makefile会自动的向下运行,从剩余的依赖关系中首先生成目标文件的所依赖的文件,最终再生成目标文件
  • 这就是make的依赖性:make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件
  • 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错;而对于所定义的命令的错误,或是编译不成功,make根本不理 —— make只管文件的依赖性

六、git的学习使用

1.在Gitee创建仓库

2.克隆项目到本地

(1)第一步:确定url

推荐使用HTTPS,因此操作简单,不需要配置

(2)第二步:clone

随后需要输入Gitee的用户名密码 (用户名在头像框下)。

稍等一会后,就完成了远程仓库的拷贝

3.Git三板斧

(1)第一招:git dd

git add +「文件名/目录名」:将需要git管理的文件告知git

【备注】:

  • git add . 表示将当前目录下没有添加的文件全部添加进去
(2)第二招:git commit

git commit -m + 「本次提交日志」: 提交改动到本地git仓库

首次commit可能还需要你指定自己的用户名和邮箱,按照提示配置即可(作用之后会提到)

【备注】: