makefile和make

  • Post author:
  • Post category:其他


一、make的安装

输入命令:

sudo apt install make

需要密码,根据提示输入密码即可。

二、makefile和make命令的介绍


makefile文件:

Linux上的项目工程管理工具,可以实现自动化编译。

主要用于项目工程里源文件过多,makefile文件可以根据类型,功能,模块,将这些源文件分好到不同目录里,makefile文件里面就可以定义一系列的规则来指定哪一些文件先需要进行编译,文件需要重新编译,甚至更复杂的操作,makefile文件就像一个shell脚本一样,可以一系列命令。|


make:是一个命令,可以解释makefile文件中的指令

eg:现有main.c,add.c,max.c三个文件需要编译

文件内容如下:

若需要编译这三个文件需要:

gcc -o main main.c add.c max.c

若只修改了其中一个文件,要想编译,就需将这三个文件都重新编译一遍,文件若很多,就很麻烦。

这时我们可以使用makefile文件,提供编写效率,通过make命令执行makefile文件,这时只会将修改过的文件或依赖修改过的文件的文件重新编译,不受影响的文件不会重新编译。

makefile文件使用如下:

makefile文件内容如下:

直接执行make命令自动执行makefile文件中的命令生成对应的可执行文件

若我们只修改main.c 中的文件

使用make命令执行

若觉得文件编译过程中生成的.o文件没有用处,还可以通过编写makefile文件删除

执行命令:

make clean


makefile文件最好不要自己改名

三、gdb调试

1) Debug版本和Release版本区别


Debug版本

叫做开发版本或者可调试版本,生成的可执行文件里面包含调试需要用到的信息。我们作为开发人员,最常用的就是debug版本产生的可执行文件。


Release版本

是发行版本,面向用户的,里面没有调试信息,所以体积会相较于debug版本非常的小.

注意:


gcc默认生成的是Release版本。

2)gcc生成Debug版本的可执行文件

Debug版本的生成:因为调试信息是在编译阶段加入到可重定向的目标文件(.o)中的,所以必须在编译阶段就让它添加调试信息。

命令如下:

1、首先

gcc -c main.c -g

(生成的中间文件main.o这时包含调试信息)

然后再通过

gcc -o main main.o

(生成了Debug版本的可执行文件)

2、一步生成

gcc -o main main.c -g


-g只能加在编译时或者一步生成时

3)通过gdb进入调试

首先需要将源文件编译,链接生成debug版本的可执行文件,然后通过“

gdb debug版本的可执行文件名

”,就可以进入到gdb调试模式。

示例:

一个有问题的main.c文件

编译运行时,发现程序存在bug

通过gdb调试,寻找问题(先生成debug版本的可执行文件,再进入gdb模式去查看问题)

gdb命令:



  • l


    //显示当前文件的源代码(回车显示后面没显示出来的)



  • list filename:num


    //显示filename文件中第num行附近的源代码


  • b 行号


    // 给指定行下断点



  • r


    (run) //启动程序


  • q


    //退出调试



  • p buff


    //临时打印数组所有元素的值


  • p val


    //临时打印变量val的值


  • p & val


    //临时 打印变量val的地址


  • p a+b


    // 临时打印表达式的值


  • p *parr@num


    //通过指向数组的指针打印数组的元素值


  • n


    (next)//单步执行,逐过程执



  • display buff


    //自动显示监视对象,操作格式和p一致


  • info break


    //显示所有断点信息


  • info display


    //自动显示所有监视对象信息


  • undisplay 编号


    //删除对应的自动显示监视对象


  • delete 断点编号


    //删除编号断点


  • c   (continue)


    //继续执行,直到执行到下一个断点


  • s


    //进去到将要被调用的函数中(逐语句)


  • finish


    //跳出函数


  • ptype  val


    // 显示变量val的数据类型

前面通过调试,我们发现程序问题在比较这一块,比较的时候将回车\n也比较了,所以导致的bug



版权声明:本文为swint_er原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。