文章目录
- Linux项目自动化构建工具-make/Makefile
- Linux调试器-gdb使用
Linux项目自动化构建工具-make/Makefile
背景
- 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力
- 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的
规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂
的功能操作- makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编
译,极大的提高了软件开发的效率。- make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命
令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一
种在工程方面的编译方法。- make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。
再上图当中,myfile与myfile处于依赖关系,它们下面形成可执行文件的代码就是依赖方法。想要将项目自动化构建成功依赖关系和依赖方法是缺一不可的。
左边的叫做目标文件而右边的叫做依赖列表,依赖列表可以是空也可以是多个文件。
上图当中形成可执行文件命令是make
/make myfile
而删除可执行文件就是make clean
当我们将目标文件myfile
和clean
交换位置,在形成可知执行文件就是make myfile
而删除可执行文件就是make
/make clean
,执行命令是从上至下的,所以第一个目标文件执行命令默认是make
。
.PHONY的意思是总是被执行的。 当然每个目标文件的是可以用的,这样就可以保证文件可以重复运行。clean是默认带的,因为删除总是可以被执行的并没有什么麻烦,而myfile就不可以了,因为文件总是被执行的很浪费时间。
myfile不加.PHONY的时候文件就不能总是被执行,而系统判断文件是否能执行的的依据是什么,就是源文件和可执行文件的时间对比,可以运行的文件,源文件应该比可执行文件的的时间要早。
从上图当中源文件的时间明显要比可执行文件早,所以现在已经是最新状态,当然如果想要不修改文件内容就改变源文件时间,可以使用touch
来欺骗make
,touch
创建文件时,如果该文件没有被创建,就创建该文件,如果已经创建了,就修改源文件的时间到当前。
Linux调试器-gdb使用
背景
在之间我学习过了编辑器,编译器,gdb就是调试器,用来查找写过代码的错误。
- 程序的发布方式有两种,debug模式和release模式
- Linux gcc/g++出来的二进制程序,默认是release模式
- 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上
-g
选项
基本操作
在操作之前需要确认一下我们的gdb是否安装,安装命令:yum install gdb
进入gdb和退出
进入gdb 文件名
退出ctrl+d/quit
将源代码展开
list/l
行号:显示binFile源代码,接着上次的位置往下列,每次列10行。
list/l 函数名:列出某个函数的源代码。
r或run:运行程序。
n 或 next:单条执行。
s或step:进入函数调用
break(b) 行号:在某一行设置断点
break 函数名:在某个函数开头设置断点
info break :查看断点信息。
finish:执行到当前函数返回,然后挺下来等待命令,前提是必须进入到当前函数当中,才能执行该命令。
print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数
p 变量:打印变量值。
set var:修改变量的值
continue(或c):从当前位置开始连续而非单步执行程序,就是从一个断点处运行到另一个的断点处。
run(或r):从开始连续而非单步执行程序
delete breakpoints(d):删除所有断点
delete breakpoints n:删除序号为n的断点,在删除断点时,并不是使用的行号而是断点的编号
disable breakpoints:禁用断点,在禁止断点时,并不是使用的行号而是断点的编号
enable breakpoints:启用断点,在启动断点时,并不是使用的行号而是断点的编号
info(或i) breakpoints:参看当前设置了哪些断点
display 变量名:跟踪查看一个变量,每次停下来都显示它的值
undisplay:取消对先前设置的那些变量的跟踪
until X行号:跳至X行,在该函数内,进行跳转并执行
breaktrace(或bt):查看各级函数调用及参数
info(i) locals:查看当前栈帧局部变量的值
quit:退出gdb
在上面的命令例子,是在当前代码中实现的
#include <stdio.h>
int addToTop(int top)
{
printf("enter addToTop\n");
int sum = 0;
for(int i = 1; i <= top; i++)
{
sum += i;
}
printf("quit addToTop\n");
return sum;
}
int main()
{
int top = 100;
int result = addToTop(top);
printf("result:%d\n", result);
return 0;
}
最后:文章有什么不对的地方或者有什么更好的写法欢迎大家在评论区指出 |