源码安装:下载程序的源代码, 并进行编译, 得到可执行程序
[缺点]:配置麻烦,对小白不友好
npm包安装:
[缺点]:其依赖的库还需要自己额外安装
yum安装
[优点]:不用编译源码;不用解决软件依赖问题
- 将一些常用的软件提前编译好,做成软件包(可以理解成windows上的安装程序)放在一个服务器上,通过包管理器可以很方便的获取到这个编译好的软件包,,直接进行安装
- 软件包和软件包管理器,就好比 “App” 和 “应用商店” 这样的关系
- yum(Yellow dog Updater,Modified)是Linux下非常常用的一种包管理器。主要应用在 Fedora, RedHat,Centos 等发行版上
(1)原理的感性理解
yum就类似于手机上的应用商店,从linux服务器上取拉取我们指定的程序
[提问]:yum是怎么知道去哪些服务器里下的呢?
[答]:Linux里有相应的配置文件。.repo就是一个个yum源了
如果下载程序速度慢或者repo中的网站为外网,那么可以考虑更新yum源。
[注意❗]:做任何配置的时候,都不要直接删除,而是先备份
(2)yum常用指令
- 搜索
- 安装
- 卸载
yum makecache
:服务器的包信息下载到本地电脑缓存起来yum -y update
:升级所有包同时,也升级软件和系统内核yum -y upgrade
:只升级所有包,不升级软件和系统内核,软件和内核保持原样
- yy :复制当前行 nyy:复制n行
- p:粘贴到当前行的下一行 np:复制n份
- dd:剪切当前行 ndd:剪切n行
- u:撤销当前操作
- ctrl + r:复原操作(针对撤销操作)
- g + g:光标快速定位到文本最开始
- shift + g(G):光标快速定位到文本末尾
- n + shift + g:光标快速定位到文本第n行
- shift + 4($):光标快速定位到文本行的末尾
- shift + 6(^):光标快速定位到文本行的最开始
- w,b:向后、向前以单词为单位进行移动
- h,j,k,l:左 下 上 右
- shift + `(ESC下面):快速大小写切换
- r:替换光标所在的字符 n r :替换成n个r
- shift + r®:批量化替换
- x:删除光标所在字符 nx:删除n个
- 替换:
[range]s / {pattern} / {string} / [flags] [count]
- range表示范围。%用于表示全文
- s表示替换
- pattern 表示字符串匹配规则,即要匹配什么样的字符串
- string 表示要将匹配到的字符串替换为的新的string字符串
- [flags] s_flags中,g比较常用,通常使用g表示全部替换,默认如果不给的话,表示只替换一次
- [count] 表示在一行中匹配多少次
- 打印:
[range]p[rint] [flags]
- 用于打印指定区间的行
- 退出:
- q:退出 (q!表示强制退出)
- wq:保存并退出。就算没有修改也会写入,并修改文件时间属性
- x: 保存并退出编辑,仅当文件有修改时会保存,并修改文件时间属性
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语言代码
- 头文件为我们提供了可以使用的方法, 开发环境。语法提示也是头文件帮助我们搜索的
- 库文件为我们提供了可以使用的方法的实现,以供链接形成我们自己的可执行程序
- 动态库:Linux(.so) windows(.dll)
- 静态库:Linux(.a) windows(.lib)
[动态库]:
- 优点:大家共享一个库可以节省空间
- 缺点:一旦库缺失,会导致几乎所有程序失效
一般而言,更推荐使用动态库,Linux系统也是这样认为,所以生成的可执行程序默认都是动态链接。
如果想生成静态链接的可执行程序,要加上
-static
的后缀,但是系统一般没有自带静态库,所以还需要额外安装glibc-static libstdc++-static
使用ldd指令可以显示链接属性
使用
gdb + 文件名
即可进行调试了,但是遇到如下错误:
- 可执行程序才可调试
【解决】:编译生成可执行程序
- 默认生成可执行程序为release版本
【解决】:加上-g选项,生成debug版本下的可执行程序
不难发现,以debug模式发布,因为包含调试信息,体积会更大
l + 行号:从第n行开始显示 (list)
b+ 行号:打断点 (break)
d+ 断点编号:删除断点 (delete)
info b:显示断点信息
s:逐语句进行 (step)
n:逐过程进行 (nest)
p+ 变量:类似于监视的作用 (printf)
display + 变量名:跟踪某一个变量,每次停下来都显示它的值
undisplay + 变量名:取消跟踪
until+ 行号:跳转到指定行号
r:运行程序 (run)
c: 从一个断点跳到另一个断点 (continue)
finish:执行完一个函数就停下
bt:查看调用堆栈
(1)是什么?
make 是一条指令,makefile(也可以是Makefile)是一个文件
makefile = 依赖方法 + 依赖关系
(2)什么是依赖方法、关系
依赖关系表明,可执行程序的实现依赖哪些源文件
依赖方法表明,源文件是如何生成可执行程序的。依赖关系和依赖方法对于Makefile文件来说缺一不可。
(3)为什么需要makefile
在VS下,我们只要写好了头文件和源文件,编译器就在自动帮我们生成可执行程序,我们从来不需要关心各个文件之间是怎样相互链接的,因为编译器已经帮我们完成了项目的构建。
如果这个过程需要我们手动完成:对于单个文件的简单程序,一条命令就可以直接搞定了(编译+连接),但是如果是一个复杂的工程,可能有成千上万个文件,然后需要链接大量的动态或静态库。试想一下,你还想一条一条命令执行吗?
因此makefile就出现了,它定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,极大的帮助我们完成项目的构建
(1)案例演示
[笔记]:
makefile文件最核心的就是说明依赖关系和依赖方法,以上面生成 mytest 文件为例说明:
- mytest 一行表示 mytest 文件的生成依赖文件 mytest.c
- gcc 一行指令说明了 mytest 是如何通过mytest.c 生成而来的(gcc编译而来)
书写makefile文件时要严格注意格式。书写依赖方法时要换行并且按下 tab 键,注意tab键不能用按相应数量的空格来代替,否则会有如下错误
依赖关系可以为空,例如 clean 的实现不依赖任何其他文件
有了Makefile文件后我们使用 make 指令就执行相应操作
(2)问题反思
- 为什么使用make指令时默认执行生成mytest的代码?
【答】:makefile在形成文件的时候默认自顶向下扫描,默认只会形成第一个目标文件,并执行该依赖关系的依赖方法。
(1)问题引入
上面例子中出现的
.PHONY
是什么意思呢? phony在英语中的意思是赝品,即我们创建了一个伪造的目标——clean。 伪目标和真正目标的区别在于,伪目标总是可以被执行:
(2)问题延伸: Linux是如何识别目标文件的新旧的?
通过
stat
指令我们可以获得文件的基础信息,我们对下面的三个时间加以说明:
- Access:表示读取或进入文件的时间
- Modify:表示文件内容被修改的时间
- Change:表示文件属性被修改的时间
由于Access的使用频率最高,所以出于优化的考虑,只有读取或者进入文件达到一定次数才会修改Access的时间
文件内容修改也有可能会改变文件属性,例如文件大小也是文件属性的一种
回到我们最初的问题,Linux是如何判断目标文件的新旧的?
【答】通过比较源文件和目标文件的 Modify 时间来判断
如果目标文件是新的,那么它的修改时间一定在源文件修改时间得到后面
反之,则说明源文件在创建目标文件后发生了改变,即目标文件变“旧”了。
当我们修改源文件后,发现又可以
make mytest
了(3)总结
.PHONY修饰的目标文件总是被执行
前面我们只提到了最简单的makefile,我们现在举一个多文件的例子来帮助大家理解makefile的意义以及输入make指令后所经历的过程:
- make会在当前目录下寻找名叫 “makefile” 或者 "Makefile"的文件
- 如果找到,它会找文件中的第一个目标文件(target)。在上面的例子中,他会找到「Add」这个文件,并把这个文件作为最终的目标文件
- 如果目标文件所依赖的文件并不存在,那么Makefile会自动的向下运行,从剩余的依赖关系中首先生成目标文件的所依赖的文件,最终再生成目标文件
- 这就是make的依赖性:make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件
- 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错;而对于所定义的命令的错误,或是编译不成功,make根本不理 —— make只管文件的依赖性
(1)第一步:确定url
推荐使用HTTPS,因此操作简单,不需要配置
(2)第二步:clone
随后需要输入Gitee的用户名和密码 (用户名在头像框下)。
稍等一会后,就完成了远程仓库的拷贝
(1)第一招:git dd
git add +「文件名/目录名」:将需要git管理的文件告知git
【备注】:
- git add . 表示将当前目录下没有添加的文件全部添加进去
(2)第二招:git commit
git commit -m + 「本次提交日志」: 提交改动到本地git仓库
首次commit可能还需要你指定自己的用户名和邮箱,按照提示配置即可(作用之后会提到)
【备注】:
- 目录里也不能为空,随便往里面写点什么都行
- 提交日志不要胡写,被同事看见就要被喷了
(3)git push
git push:同步到远端服务器上
(1)git log
使用 git log 指令后我们就可以看见这段代码的作者、它的联系方式以及他所写的注释 。
如果对这段代码有疑惑,可以通过邮箱来联系到相应的作者,这也就是我们之前指定自己用户名和邮箱的意义所在
(2).gitignore
.gitignore属于隐藏文件,要想他显示出来需要加上-a选项
我们也可以进一步修改.gitignore来过滤掉自己不需要的后缀的文件
commit后我们就已经可以发现a.x和a.X根本没有被添加进去
我们尝试单个add,结果更加明显
(3)git status
使用该指令可显示当前git的状态
(4)git pull
当Gitee仓库中的内容发生改变后,你直接git push很容易造成代码冲突。
首先输入指令git pull,它的作用是取回远程主机某个分支的更新,再与本地的指定分支合并。之后再次push就不会冲突了