Linux中gdb调试与make生成多文件项目

gdb与makefile

  • gdb调试程序
  • make与makefile

gdb调试程序

在Linux当中使用g++编译后生成的可执行程序,默认以动态链接且以release发布,也就是说不能进行debug调试。所以在对源程序g++进行编译的时候需要在最后加上-g,来表示以debug方式发布。我们可以看到debug发布的hello-d文件大小明显比hello文件要大,多出来的正是调试所需要的调试信息。
Linux中gdb调试与make生成多文件项目_第1张图片
我们使用命令readlf -S hello-d | grep debug来查看多出来的调试信息
Linux中gdb调试与make生成多文件项目_第2张图片
通过 gdb+文件名 就可以对文件进行调试
在这里插入图片描述
list 1,后面的数字可以写成任意,意思是显示的内容起码包含第一行,回车显示下一个模块,直到显示完毕。也可以写成 l 1,
Linux中gdb调试与make生成多文件项目_第3张图片
break 16,代表在第16行打上断点,也可以简写成b 16
info b,查看断点的位置,以及其他信息
Enb 代表是否可见,在Windows编译器中,断点是可以被隐藏起来,当Enbfalse代表不可见,也就是被隐藏了。这里打了两个断点一个在17行,一个在16行。
在这里插入图片描述

通过run命令,在我们打的第一个断点处16行停了下来,然后我们想进入Sum函数的话就可以用step命令,相当于Windows编译器中的f11.若果不想进入的话就用next命令,相当于f10。

Linux中gdb调试与make生成多文件项目_第4张图片
那么怎么实现vs2013中监视窗口查看变量的值呢,通过p +变量名
来查看。
,同
但是这样必须每次都手动打,假如想看每一次循环的值,动态进行变化呢?通过display+变量名的方式。可以看到每次继续往下走,都会展示我们想看到的那两个变量。
Linux中gdb调试与make生成多文件项目_第5张图片
假设找到问题,或者不想看了。通过undisplay取消要展示的变量。需要注意这里是undisplay+编号,编号就是变量之前的数字。undisplay+变量名是不行的。
在这里插入图片描述
想看i=100的时候最后一次循环,set var i=100;

在这里插入图片描述

(服务器卡了一下,导致这个图片和上面变量的编号不一样)
Linux中gdb调试与make生成多文件项目_第6张图片
与之前的display一样,需要删除断点仍然需要先查看他的编号,然后delete对应的编号可以简写成,d+编号
Linux中gdb调试与make生成多文件项目_第7张图片
disable+断点编号 将enb设置为不可见相当于禁用。
enable+断点编号 将enb设置为可见相当于启用。
注意区分禁用与删除。
在这里插入图片描述
从一个断点到到另一个断点用continue命令,简写成c。断点中间的代码也是执行了的。用于划分代码块,确定错误的范围

finish命令运行完当前函数,可以用于检查某个函数是否正常。
Linux中gdb调试与make生成多文件项目_第8张图片
q进行退出,一旦源程序修改,需要重新编译。

make与makefile

  • make是个命令,makefile是一个文件,二者搭配使用用于我们完成大型项目。
  • makefile文件中定义了一系列规则,那些文件需要先编译,那些文件后编译等等,还有更复杂的操作。
  • makefile是完全自动的,只需要一个make命令,整个工程完成编译,提高效率。
  • 在vs中项目管理(逻辑关系,先后顺序)是vs中自动完成的。

把之前写的代码拷贝一份至make练习文件夹。
Linux中gdb调试与make生成多文件项目_第9张图片
然后vim编写makefile的依赖关系与逻辑。
第一行依赖关系,第二行依赖方法。make构建工程
在这里插入图片描述
make执行
在这里插入图片描述
生成了hello文件,至此相当于vs中的生成解决方案。
Linux中gdb调试与make生成多文件项目_第10张图片
那么vs清理解决方案呢,那就需要我们在往makefile里面加入逻辑。
.PHONY:clean叫做伪目标,因为hello还没有生成。
makefile默认只生成一个可执行就是hello。
Linux中gdb调试与make生成多文件项目_第11张图片
而.PHONY的作用:

  • 后面常跟伪目标(跟真目标也可以,但一般不那么做)
  • 伪目标总是被执行。

这里可以看到,make只执行了一次,make clean总是可以执行

  • Linux中gdb调试与make生成多文件项目_第12张图片
    看一下它完整的逻辑:
    完全符合编译的四大过程。不过是相反的,因为他要先去找hello.o,找hello.o需要先找到hello.s,找hello.s需要找到hello.i,找hello.i需要找到hello.cpp,找到继续往回执行。是依赖关系。
    clean的方法也要写上,全部清理掉。
    Linux中gdb调试与make生成多文件项目_第13张图片

make生成:
Linux中gdb调试与make生成多文件项目_第14张图片
clean清除:
Linux中gdb调试与make生成多文件项目_第15张图片
命令执行成功。

以上是一个单文件的版本,下面来看多文件。以一个简单计算器程序为例。
创建多文件所需的.h和.c文件
在这里插入图片描述
清除掉之前makefile里的内容
在这里插入图片描述
makefile写入依赖关系,依赖方法,伪目标
Linux中gdb调试与make生成多文件项目_第16张图片
make生成可执行文件。
在这里插入图片描述
那万一依赖关系有很多文件呢,我们可以在依赖方法中用通配符来解决。
Linux中gdb调试与make生成多文件项目_第17张图片
make依旧可以生成

那依赖关系中的很多文件名都不想写呢,在makefile里面可以定义变量,然后用脚本。之后会学到

在这里插入图片描述

查看生成文件,运行一下正确。
在这里插入图片描述
make clean清除掉,成功
在这里插入图片描述

补充:之前写到make只能make一次,将生成程序删除或者源文件修改之后才能重新进行make。那么编译器是怎么知道我生成源文件被修改呢。
它是根据文件的事件改变,来判断文件是否被修改。
Access被访问时间,modify文件修改时间(内容被修改),change文件属性被修改时间。
在这里插入图片描述

你可能感兴趣的:(Linux操作系统,linux,c++,makefile)