Linux应用程序开发工具-GDB调试与Make

来源:互联网 发布:artrage mac破解 编辑:程序博客网 时间:2024/05/21 07:43

    为了提高编译程序的效率,很多基于Windows的开发系统都提供了工程管理器。 GCC提供了半自动化的工程管理器。半自动化,即使用工程管理器前需要自己进行程序编译规则的编写。Make工程管理器完全根据Makefile文件中的编译规则进行编译,Makefile由以下三部分组成:

    1)需要生成的目标文件(target file)

    2)生成目标索取要的依赖文件(dependency file)

    3)生成目标文件的编译规则命令行(command)

    这三项内容按以下格式进行组织:

    target file :dependency file

    (TAB)command

make编译文件的流程如下:

    1)在当前目录下读取Makefile文件

    2)查找Makefile文件中的第一个目标文件

    3)把目标文件的依赖文件当作目标文件进行依赖规则检查:

        1.如果当前目录下没有或缺少依赖文件, 则执行其规则命令生成依赖文件(比如缺少 a.1文件,则执行命令“cc-c a.c”生成a.o)

        2. 如果存在依赖文件, 则把其作为目标文件来检查依赖规则(假设 a. c比 a. o新, 则执行命令“cc-c a. c”更新 a. o)。

        3.如果目标文件比所有依赖文件新,则不做处理。

    4)递归执行第三步后, 就会得到目标文件 test所有最新的依赖文件了。接着 Make会根据以下三种情况进行处理:

        1. 如果目标文件 test不存在(比如第一次编译), 则执行规则命令生成 test。

        2. 如果目标文件 test存在, 但存在比 test要新的依赖文件, 则执行规则命令更新 test。

        3.  目标文件 test存在,且比所有依赖文件新,则不做处理。

Makefile特性介绍:

    1)变量

         使用方式为$(变量名)

    定义变量的方式由以下几种:

        1.“=”

         如  a1=$(a2)

        2.":="

         如  a1:=a.o

        3."+="   通过此方法可给变量追加值

        4.“?=” 通过此方法,如果该变量在前面已经定义,则此次定义无效

     2)自动推导

         为了进一步简化 Makefile的书写, Make工程管理器提供了自动推导的功能。 自动推导功能默认每个目标文件都有一个与之对应的依赖文件。比如 a. o文件有依赖文件 a. c与之对应)。这样在 Makefile中就不需要指定与目标文件对应的依赖文件名了。此外,自动推导功能还能推导出与目标文件对应的基本编译规则命令。

     3)伪目标

         伪目标不是真正的目标文件,所以通过伪目标可以让Make工程管理器只执行命令,而不用创建实际的目标文件,使用方法为:

         make  伪目标名

         为了不和真实文件进行混淆,最好用.PHONY对伪目标进行标记。

     4)文件查找

        1.VPATH

         Make在当前目录找不到源文件的情况下就会自动到VPATH指定的路径中去寻找

         例:  VPATH = 目录 : 目录  。。。。。。  (会在目录中依次查找)

        2.vpath

          与VPATH不同,vpath并不是变量而是关键字。

          例:  vpath 模式 目录: 目录  (如   vpath  %.c  /a  :/b按顺序依次查找a,b目录下所有C文件)

     5)嵌套执行

          把所有源文件的编译规则放在一个Makefile内会让文件显得过于臃肿,所以可以将Makefile分解成多个子Makefile文件,并放置到程序的每个子目录中,,每个子Makefile文件负责每个子目录下的文件编译。Make会先读取总Makefile文件,再调用各个子Makefile文件。这个过程即为嵌套执行。

          使用方法:  cd  子目录  &&  $(MAKE)

                                或

                                $(MAKE)    -c   子目录

    6) 条件判断

           使用方法: 条件表达式

                                       如果真时执行的文本段

                                endif

                                或

                                条件表达式

                                       如果真执行的文本段

                                else

                                       如果假执行的文本段

                                endif

条件表达式有四种格式:

    1.ifeq(参数1,参数2):比较参数1,参数2是否相同,相同为真

    2.ifneq(参数1,参数2):比较参数1,参数2是否不同,不同为真

    3.ifdef(参数):参数非空为真

    4.ifndf(参数):参数为空为真

    7)参数

              使用方法: $ (函数名 参数 参数)


GDB调试器:

     使用方法: gcc -g 文件名1 选项 文件名2

                          gdb 文件名2

     基本命令:1.  l  :显示文件源程序的10行代码

                         2. b   : 数字/函数名  在源程序的第(数字)行或(函数名)处设置断点

                         3.info b  :查看当前断点情况

                         4.  r   :运行程序,如果程序中有断点,会在断点处停止

                         5.   c    :继续运行程序

                         6.   n/s  :逐行继续运行程序,区别在于,当运行程序过程中遇到函数调用,n不会进入函数内部,而s会

                         7.   p  变量名  :查看变量当前值