GCC、Makefile、GDB之间的关系

GCC是一个编译链,将一个.c文件编译为一个可执行文件

例如一个hello.c文件,在Linux下编译过程

gcc -E hello.c -o hello.i //第一步:hello.c(文本)经过预编译生成hello.i(文本)
gcc -S hello.i -o hello.S //第二步:hello.i(文本)经过编译器生成hello.s(汇编、文本)
gcc -c hello.c -o hello.o //第三步:hello.s(文本)经过汇编器生成hello.o(二进制)
gcc hello.o -o hello    //第四步:hello.o(二进制)经过链接器生成hello可执行文件

一般情况下直接使用以下命令

gcc hello.c -o hello

直接生成可执行文件hello。

也可以使用以下命令

gcc -Wall hello.c -o hello

其表示将文件"hello.c"中的代码编译为机器码并存储在可执行文件 hello 中。机器码的文件名是通过-o 选项指定的。如果当前目录中与可执行文件的文件名已经存在,将会覆盖旧文件。选项-Wall 开启编译器几乎常用的安全警告(强烈建议使用该选项)。默认情况下GCC不会产生任何警告信息,当编写C/C++ 程序时警告非常有利于检测程序存在的问题。

要运行该程序,输入可执行文件的路径,可输入以下命令

./hello

MAKE & MAKEFILE

  Make是Linux下的一款程序自动维护工具,配合makefile的使用,就能够根据程序中模块的修改情况,自动判断应该对那些模块重新编译,从而保证软件是由最新的模块构成。make可以帮我们解决这两个问题——当程序的源文件改变后,它能保证所有受影响的文件都将重新编译,而不受影响的文件则不予编译。make 命令执行时候,需要一个makefile文件确定make需要怎么样去编译和链接程序。只要我们makefile写的好,一个make命令就可以有效率的完成编译的任务,自动根据当前文件的修改情况来确定哪些文件需要重编译,从而自己编译所需要的文件和链接目标程序。

目前在看《跟我一起写Makefile》

GDB

  GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。一般来说,GDB主要帮助你完成下面四个方面的功能:

  1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。

  2、可让被调试的程序在你所指定的调置的断点处停住。

  3、当程序被停住时,可以检查此时你的程序中所发生的事。

  4、动态的改变你程序的执行环境。

  在可以使用gdb调试程序之前,必须使用-g 或者 -ggdb编译选项编译源文件。可以输入以下命令

gcc -g hello.c -o hello

再输入

gdb hello

举个例子:gdb(一些基本的调试命令)

需要调试的程序在编译的时候要加 -g 选项,程序才能进行调试

list 显示源文件:

          list 没有参数,显示当前行之后或周围的10多行

          list start,end  显示从行号start到end之间的代码行。

  

print 查看运行时的数据

    print i    显示当前变量i的值

    print &i   显示变量i的存放地址

    print array@1   显示从array(数组名)开始的5个值

    print array[2]@3  显示从array第二个元素开始的3个数组元素的值

    whatis i       显示变量i的数据类型

设置断点 break

   break linenum    在当前文件指定行linenum处设置断点

    break function   在当前文件函数function的入口处设置断点

显示断点 info  info breakpoints/break/watchpoints  [num]

单步跟踪 step [N]  如果遇到函数调用,并且该函数编译时有调试信息,则会进入该函数内执行。

       next [N]  遇到函数调用时,执行整个函数。

连续执行continue 从当前行开始,连续执行到下一个断点处,或者到达该程序结束。命令中可以给出一个数字N,忽略其后N-1次断点。

运行程序 run。

clear(清除所有已定义的断点),delete(删除所有断点,后面可给出断点号码,多个断点用空格分开)

  

 

 

 

 

 

 最后,补充一句上面的函数都可以用首字母简写

总结一下:用过keil的朋友都了解下面这个软件界面

 

 

 Makefile就相当于“有改变的文档再编译”那个选项,GDB就相当于“进入debug调试模式”的选项,GCC相当于“全部文档编译”的选项。“有改变的文档再编译”与“进入debug调试模式”的区别在于所要编译的文件多少不同,故而编译的时间不同,一般一个程序先进行全编译之后,看是否有报错或警告,之后进行更改,加入自己代码,再进行部分编译。

GCC就是一个纯编译器,而make更牛逼些,包括了GCC,只有把makefile解决,也就一切OK,GDB调试C程序,需要先用GCC编译,见以上写的两条命令,然后按照例子就可以用GDB调试了。

posted @ 2022-11-21 15:38  林长超  阅读(553)  评论(0)    收藏  举报