文章目录
1. 安装软件(yum)
centos 7中
- 源码安装
- rpm包安装
- yum安装:1.不用编译源码 2.不用解决软件的依赖关系
查找ls软件:yum list | grep sl
安装sl软件:sudo yum install sl
卸载sl软件:sudo yum remove sl
sl是一个可以跑火车头的软件。
大家现在只需要知道用yum安装软件可以很简单就行了。
我们要安装别人的软件:
- 需要别人先把代码编译成为可执行程序
- 需要有人将编好的软件放在用户能下载的地方(官网,应用软件市场)
在Linux中也是一样的!yum还会帮你解决依赖关系,这里不展开讲。
注意:
- 不是所有同学的Linux上面的yum源都是国内的链接
- 如果不是国内的或者安装软件特别慢,建议更新yum源
2. vim工具
vim是一个编辑器,只能用来写代码,但是它功能强大,是一个多模式的编辑器。
为什么要学vim?
有时候需要我们在生成环境下,快速的定位问题,甚至需要快速的修改代码。
2.1 vim的使用
在工作目录下创建好要编辑的文件,**vim [文件名]**就能进入编辑了,gcc [文件名]编译,./a.out运行
三种模式:正常模式、插入模式、底行模式
2.2 命令模式下的文本批量化操作
3. Linux编译器-gcc/g++使用
3.1. 背景知识
3.2 gcc如何完成
格式 gcc [选项] 要编译的文件 [选项] [目标文件]
3.3 预处理(进行宏替换)
gcc –E test.c –o hello.i
-E:从现在开始给我进行程序的翻译,当预处理完成就停下来。
-o:把程序预处理的结果写入目标文件hello.i
在命令模式输入:vs hello.i就能进行对比观察,Ctrl+ww可以让光标在两个文件之间进行转换
代码预处理完还是C语言,只不过是一份干净的C语言。
3.4 编译(生成汇编)
在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查
无误后,gcc 把代码翻译成汇编语言
gcc -S test.i -o test.s
-s:从现在开始进行程序的翻译,当我们编译完成之后就停下来。
3.5 汇编(生成机器可识别代码)
汇编阶段是把编译阶段生成的“.s”文件转成可重定位二进制文件.o/.obj
gcc -c test.s -o test.o
-c:从现在开始进行程序的翻译,当我们汇编结束后就停下来。
注意:所有包含头文件的操作,本质是因为想使用头文件所声明的方法!如果我们不需要用,头文件就不是必须的。
3.6 连接(生成可执行文件或库文件)
我们从头到尾都只编译了自己的代码,但是我们代码中所需要的printf在哪里?我的代码中使用了printf,如何和目标printf的实现产生关联(链接)?
代码中所需要的printf在C标准库:/lib64/libc-2.17.so还需要进行链接
gcc test.o -o mytest
这行命令隐含的就是链接我们自己的程序和库,形成可执行程序!
./mytest //运行程序
ldd命令可以参考程序所依赖的库和链接方式
ldd mytest
3.7 库的概念
头文件:给我们提供了可以使用的方法,所有的开发环境具有语法提示,本质是通过头文件帮我们搜索的!
库文件:给我们提供了可以使用的方法的实现,以供链接,形成我们自己的可执行程序!
感性认识:
动态库:Linux(.so) windows(.dll) 动态链接
静态库:Linux(.a) windows(.lib) 静态链接
动态链接:
优点:大家共享一个库,可以节省资源
缺点:一旦缺失,会导致几乎所有程序失效
静态链接:将库中的相关代码直接拷贝到自己的可执行程序中!
优点:不依赖任何库,程序可以独立执行
缺点:浪费资源
默认情况下,形成的可执行程序是动态链接的,可以用 file [可执行程序]查看
可以通过以下方式改为静态链接
gcc test.c -o mytest2 -static
大小是动态链接的约100倍!
4. gdb
进入gdb调试器:
gdb [可执行程序]
注意:默认生成的可执行程序无法调试,因为默认的可执行程序是release模式!
我们需要在编译的时候加上选项形成debug模式的可执行程序:
gcc hello.c -o hello_g -std=c99 -g
b 行号:打断点
d 断点编号:取消断点
info b:查看断点信息
l 行号:显示代码 l 0从0开始显示一直按回车可以显示完
s:step,逐语句(进入函数)
n:next,逐过程
display 变量名 && undisplay 变量名:常显示或者取消常显示
until 行号:跳转到指定行
r:运行程序
c:从一个断点跳转(运行)到另一个断点
finish:执行完成一个函数就停下来
5. make/makefile
5.1 背景
项目构建
项目结构:
- 多文件.h, .c, .cpp,先编译哪一个程序?
- 链接需要哪些库?
- 库和头文件在哪里找?
- 整个项目结构该如何,为什么?
5.2 概念
make是一个命令,makefile是一个文件。
Makefile(首字母大小写无所谓):在当前路径下的一个普通文件。
- 依赖关系:mytest -> mytest.c
- 依赖方法:gcc mytest.c -o mytest
目的:形成可执行程序
写一个最简单的Makefile:
如果我想运行程序直接敲make命令就行了
如果我想清理程序用make clean命令。类似VS的重新生成解决方案,清理脏值。
.PHONY可以看成是Makefile中的一个关键字,clean被.PHONY修饰时表明:总是被执行!:无论目标文件是否新旧,照样直接执行依赖关系!
那么问题来了Makefile是如何识别我的exe/bin是新的还是旧的呢?
stat命令可以查看文件被打开、修改属性或者修改内容的时间:access是访问时间由于操作频繁,一般不会更新。change是属性被修改的时间,modify是内容被修改的时间。改属性不会影响内容,但是改内容可能会影响属性(size).
根据对比源文件和可执行程序的最近修改时间,评估要不要重新生成!
clean是一个伪目标,也有依赖关系(空)和依赖方法。像mytest就是一个正常目标,依赖关系是mytest.c。
注意:依赖方法必须以tab键开头!
Makefile默认只会形成第一个目标文件,执行该依赖关系的依赖方法。
5.3 多文件的Makefile
首先我建一个multi_make的目录来演示,分别创建test.h、test.c、main.c的文件。
如果想要生成可执行程序,最简单的方法就是:直接用gcc将main.c test.c生成可执行程序
gcc -o hello main.c test.c
但是我们今天不这样做,我们采用Makefile的方法
效果:
6. Linux第一个小程序(进度条)
6.1 缓冲区的理解
缓冲区就是一段内存空间:
- 立马将内存中的空间显示出来,刷新策略:行刷新。
- 不想用\n,就像让你的数据立马刷新!这时就可以用fflush(stdout);
6.2 回车 vs 换行
回车:将光标回到当前行的最开始
换行:在光标所在位置新起一行(光标列的位置不变)
回车是\r,\n是回车+换行
6.3 倒计时程序
写一个数字,光标回到最开始新数字覆盖旧数字
6.4 进度条
7. git
.gitignore相当于黑名单,可以在这个黑名单文件内编辑自己不想上传的文件,通过添加文件后缀。