提示:本文内容较长,请参考左侧目录阅读
yum(Yellow dog Updater,Modified)是Linux下常用的一种包管理器,我们可以把它理解成手机中的应用商店。
以下载安装lrzsz为例子,演示yum的三个基本功能
yum list | grep lrzsz
这个指令的含义是:通过管道把yum检索的结果传递给grep,过滤其中包含lrzsz的软件包。
sudo yum install lrzsz
调用root权限安装lrzsz软件。
sudo yum remove lrzsz
调用root权限删除lrzsz软件。
lrzsz是一个用于文件的上传和下载的工具
vim和vi都是多模式的编辑器,区别就是vim是vi的升级版,可以兼容vi的所有指令。
vim有三种常用模式:
普通模式,插入模式,末行模式。
在使用vim前,可以安装一个vimforcpp插件,方便写C/C++代码。初学时不了安装和配置可以直接复制下面这段指令到命令行中:
curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh
通过修改"~/.vimrc"(家目录下的.vimrc文件)文件修改vim配置
下面的内容可以根据自己的代码风格选择是否修改:
如果代码风格是上图中的style不用更改,而如果代码风格是上图的style2则需要进行更改:
初学时对这些修改内容的含义可能不理解,可以先照搬,不用完全理解。
如果上一次编辑时异常退出了,就会产生这样的警告,这是因为异常退出导致.swp文件没有删除,当进入vim时遇到这样的警告,按"d"将.swp文件删除即可。
七字真言
移、删、复、替、撤、更、跳,这是正常模式常用的七个类型的指令。
✳这里的删除本质上都是剪切,可以通过p进行粘贴。
除了这七种操作外,还有两种操作是比较常用的
注释
1.正常模式下,将光标移动到要开始进行多行注释的行,按Ctrl+v进入多行注释模式
2.通过j和k上下移动光标选取行
被选中的行会变色。
3.shift+i进入插入模式
4.输入://
5.按Esc
多行注释完成。
去注释
1.第一步与多行注释相同,进入V-Block模式
2.移动光标选定要去注释的行,选完行后,再将光标向右移动,将注释符号//两个斜杠全部覆盖,如图:
3.按x,删除两个斜杆,完成去注释
首先将光标移动至要进行替换的行,按":“进入底行模式,键入s/,后面跟要被替换的字符,再键入”/“,后面跟替换后的字符,最后面再跟一个”/"。
如图:
这个指令的含义是,将光标所在行的main替换成linux。
替换结果:
此外,还可可以在s前面加"%",表示全文,或"num1,num2"指定行,而在后面加"g"表示当前行所有。
这个语句的含义是,将全文所有的main替换成linux。
替换结果:
进入末行模式之前,先按下Esc键返回正常模式,再按":"键进入末行模式。
Linux中使用gcc或者g++指令对C和C++程序进行编译。语法格式如下:
gcc [选项] 要编译的文件 [选项] 目标文件
预处理阶段主要进行宏替换、头文件展开、去注释、条件编译等工作
指令:
gcc -E test.c -o test.i
编译阶段,gcc会检查代码的语法正确性,将代码翻译成汇编语言
指令:
gcc -s test.i -o test.s
含义与预处理阶段相似,这里的test.i文件也可以用test.c文件替代,即编译阶段可以直接编译未经处理的.c文件,也可以编译预处理阶段生成的.i文件
编译后生成汇编:
汇编阶段将汇编代码转换为二进制机器码
gcc -c test.s -o test.o
与前一阶段相同,这里的test.s文件也可以用test.i或者test.c
test.o就是生成的二进制目标代码:
二进制机器码用vim打开会看到上图所示的乱码。
链接阶段会生成可执行文件或库文件,即将若干个二进制代码文件或库文件链接起来生成可执行程序
gcc test.o -o mytest
这里gcc后面没有可选项,直接跟二进制文件,生成可执行程序mytest
至此,程序编译的四个阶段完成,最终生成可执行程序。
总结C/C++程序编译的四个步骤:
系统会把基本函数功能的实现都放到名为lib.so.6的库文件当中去,在使用到这些函数时,gcc会到系统默认的搜索路径"/usr/lib"下进行查找,即链接到lib.so.6库函数当中。
静态编译与动态编译:
gcc编译时默认使用动态库,可以通过file指令查看文件属性,并通过ldd指令查看可执行程序连接的库文件,如图:
从上图可以看出gcc编译使用的动态链接,并看出链接的库文件。如果要进行静态编译,需要加上-static
gdb进行调试时,必须使用debug版本,如果使用release版本,会有报错:
进行调试前,要先拥有一个可执行程序
test.c源文件:
#include
2 typedef struct grade
3 {
4 int num;
5 int grade;
6 }GRADE;
7 int main()
8 {
9 //查看数组
10 int arr[10]={0,1,2,3,4,5,6,7,8,9};
11 printf("%d\n",arr[0]);
12
13 //查看指针变量及指针解引用
14 int a=10;
15 int *p=&a;
16 printf("a:%d *p:%d\n",a,*p);
17
18 //查看结构体变量
19 GRADE stu;
20 stu.num=1;
21 stu.grade=9;
22 printf("num:%d grade:%d\n",stu.num,stu.grade);
23
24 //查看结构体指针
25 GRADE*ps=&stu;
26 ps->num=2;
27 ps->grade=8;
28 printf("num:%d grade:%d\n",ps->num,ps->grade);
29
30 return 0;
31 }
gdb mytest
源码显示
运行程序
断点
[b 行号] 在某一行设置断点
[b 函数名] 在函数开头设置断点
[delete breakpointes] 删除所有断点
[delete breakpointes n] 删除序号为n的断点
[disable breakpointes] 禁用断点
[enable breakpointes] 启用断点
查看变量
堆栈及函数调用
Tips
gdb调试时,若无指令输入时按回车,会执行上一次的指令,在进行逐步调试时可以用到,第一次键入n或者s即可,后面按回车键即可。
核心转储文件core dump反应的是在程序运行崩溃的一瞬间的内存映像(相当于案发现场)
core file size,表示 核心转储文件的大小,当core file size的值为0时,表示不产生核心转储文件;core file size值为unlimited表示不限制核心转储文件大小,只要core dump大小小于磁盘空间,都会正常产生。
修改core file size大小为unlimited后,若程序崩溃,如产生指针越界访问等问题,便会产生coredump文件,如图:
gdb coredump调试
根据core dump文件中提供的信息分析程序发生崩溃的原因。
目标对象:依赖对象
编译命令
注意第二行编译命令的前面有一个Tap键的空间(四个空格)。
1.执行make指令时,它会自动查找当前目录中文件名为"makefile"或"Makefile"的文,并对其内容进行解析,编译程序,若未找则会报错。
2.make只为生成第一个目标对象而服务,如果为了生成第一个目标对象,需要先生成依赖对象,则会继续在makefile文件中查找生成依赖对象的方法,若发现依赖对象不存在,报错返回。
eg:
此时,执行make指令相当于执行了4个gcc指令,一次产生了"test.i"“test.s”“test.o"文件和可执行程序"mytest”。
makefile中的依赖对象为test.o文件,原则上这时应该在当前目录中寻找test.o文件,如图:
当前目录中并没有test.o文件,但是仍然生成了可执行程序:
这是因为当前目录下有一个名为"test.c"的文件,make自动补全了一条指令,将"test.c"文件编译成了makefile中的依赖对象"test.o"文件,可以称为酌情补全,在编译程序时,不能依赖这种补全方式,要将"makefile"文件写完整。
在执行make指令时,会碰到这种情况:
因为依赖对象的最后一次修改时间小于目标对象的修改时间,所以make指令不执行。(即当前可执行程序已经是最新的,不用再进行编译)
.PHONY:[伪目标名称]
伪目标的特性:命令总是被执行,不关心最后一次修改时间
如图:
用.PHONY修饰了mytest,所以再次make时,gcc仍会执行,如图:
根据伪目标的特性,可以进行项目清理,清除所有目标文件,以便重新编译:
这样便利用伪目标的特性实现了便捷的项目清理。