目录
⚔软件管理包
- 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.
- 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装.
- 软件包和软件包管理器, 就好比 "App" 和 "应用商店" 这样的关系.
- yum(Yellow dog Updater, Modifified)是Linux下非常常用的一种包管理器. 主要应用在Fedora,RedHat,Centos等发行版上
软件包的查看~
yum list | grep lrzsz 指定查找软件包~
Notice:
- 软件包名称: 主版本号.次版本号.源程序发行号-软件包的发行号.主机平台.cpu架构.
- "x86_64" 后缀表示64位系统的安装包, "i686" 后缀表示32位系统安装包. 选择包时要和系统匹配.
- "el7" 表示操作系统发行版的版本. "el7" 表示的是 centos7/redhat7. "el6" 表示 centos6/redhat6.
- 最后一列, base 表示的是 "软件源" 的名称, 类似于 "小米应用商店", "华为应用商店" 这样的概念
🗡安装卸载软件包
安装一个小牛会说话~
yum install cowsay 就可以~
卸载:
yum remove cowsay
⚔Linux开发工具
🗡vim的介绍使用
vim 主要有三种模式~
- 命令模式(command mode)
- 插入模式(Insert mode)
- 底行模式(last line mode)
🗡正常模式命令集
按「 $ 」:移动到光标所在行的“行尾
shift+$移动到行尾。+^移动到行首~
w光标跳到下个字母开头~e跳到下个字母末尾~
b光标回到上个字母开头~
dd删除目标行~
yw将光标所在处到字符尾复制到缓冲区~
yy复制当前行~~p粘贴当前行~
u撤销上一次操作~
ctrl + r 撤销的恢复~
⚔gcc g++使用
我们之前所了解到的~我们在写完代码到运行出结果总共经历4个阶段~
1.
预处理(进行宏替换
)
2.
编译(生成汇编
)
3.
汇编(生成机器可识别代码)
4.
连接(生成可执行文件或库文件
)
🗡预处理
预处理功能主要包括宏定义
,
文件包含
,
条件编译
,
去注释等。
预处理指令是以
#
号开头的代码行。
实例
:
gcc –E hello.c –o hello.i
选项
“-E”,
该选项的作用是让
gcc
在预处理结束后停止编译过程。
选项
“-o”
是指目标文件
,“.i”
文件为已经过预处理的
C
原始程序~
🗡编译
在这个阶段中
,gcc
首先要检查代码的规范性、是否有语法错误等
,
以确定代码的实际要做的工作
,
在检查无误后,gcc
把代码翻译成汇编语言。
用户可以使用
“-S”
选项来进行查看
,
该选项只进行编译而不进行汇编
,
生成汇编代码。
实例
:
gcc –S hello.i –o hello.s
🗡汇编(转为二进制)
汇编阶段是把编译阶段生成的
“.s”
文件转成目标文件
读者在此可使用选项
“-c”
就可看到汇编代码已转化为
“.o”
的二进制目标代码了
实例
:
gcc –c hello.s –o hello.o
🗡链接
在成功编译之后
,
就进入了链接阶段。
实例
:
gcc hello.o –o hello
⚔Linux调试工具gdb
程序的发布方式有两种,
debug
模式和
release
模式
Linux gcc/g++
出来的二进制程序,默认是
release
模式
要使用
gdb
调试,必须在源代码生成二进制程序的时候
,
加上
-
g
选项~
list 列出行号,接着上次位置往下列~,每次列10行
list函数名,列出函数名的源代码~
r 运行程序~
n 单条执行~
s 进入函数调用~
break 行号 在某一行设置断点~
break 函数名 某个函数开头设置断点~
info b 查看断点信息~
finish 执行完函数~停下来等命令~
p 变量 打印变量值~
set var 修改变量值~
continue 从当前程序连续执行程序~
d b 删除所有断点~
disable 禁用断点~
enable 启用断点~
quit 退出gdb
⚔Linux项目自动化构建工具
make命令需要在文件对写好依赖方法的文件搭配使用就可以直接--自动化编译--~
🗡工作原理
- make会在当前目录下找名字叫“Makefifile”或“makefifile”的文件。
- 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“hello”这个文件,并把这个文件作为最终的目标文件。
- 如果hello文件不存在,或是hello所依赖的后面的hello.o文件的文件修改时间要比hello这个文件新(可以用 touch 测试),那么,他就会执行后面所定义的命令来生成hello这个文件。
- 如果hello所依赖的hello.o文件不存在,那么make会在当前文件中找目标为hello.o文件的依赖性,如果找到则再根据那一个规则生成hello.o文件。(这有点像一个堆栈的过程)
- 当然,你的C文件和H文件是存在的啦,于是make会生成 hello.o 文件,然后再用 hello.o 文件声明make的终极任务,也就是执行文件hello了。
- 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
- 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。
- make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对make就不会执行了~
fflush(stdout);是直接将信息打印到屏幕上~