http://www.cnblogs.com/4925278/archive/2012/11/28/gcc-gdb-make-makefile.html
gcc-gdb-make-makefile
1、gcc编译程序时,编译、连接的过程可以被细分为四个阶段:
预处理(Pre-Processing)
编译(Compiling)
汇编(Assembling)
连接(Linking)
2、gcc通过文件的后缀来区别输入文件的类别:
(1) 以.c为后缀的文件:C语言源代码文件。
(2)以.a为后缀的文件:是由目标文件构成的库文件。
(3)以.C,.cc或.cxx为后缀的文件:C++源代码文件。
(4)以.h为后缀的文件:头文件。
(5)以.i为后缀的文件:已经预处理过的C源代码文件。
(6)以.ii为后缀的文件:已经预处理琮的C++源代码文件。
(7)以.o为后缀的文件:编译后没有连接的目标文件。
(8)以.s为后缀的文件:汇编语言源代码文件。
(9)以.S为后缀的文件:经过预编译的汇编语言源代码文件。
3、gcc的基本命令:
命令格式:gcc [Option] [filename]
Option的取值:
-o:指定编译后的目标文件名。
gcc hello.c -o hello --> hello
gcc hello.c -->a.out
-c:只编译不连接成为可执行文件。
-g:产生调试程序(GNU的gdb)所必要的符号信息。
-O:对程序进行优化编译、连接,编译、连接的速度要慢一些。
-O2:比-O更始的优化编译、连接,编译、连接过程序也会更慢。
-Idirname:将dirname所指出的目录加入到程序头文件目录列表(/usr/include)中。
-Ldirname:将dirname所指出的目录加入到库文件目录列表(/usr/lib)中。
-lname:在连接时,装载名字为“libname.a”的函数库。
-static:静态连接库文件。
-Wall:生成所有警告信息。
-w:不生成任何警告信息。
-DMACRO:定义MACRO宏,等效于在程序中使用:#define MACRO
4、GDB调试程序
(1)功能:
a、启动被调试程序。
b、让被调试程序在指定位置停住。
c、当程序被停住时,检查程序状态。
(2)相关命令
命 令 | 含 义 |
gdb gdb filename | 启动GDB |
l/list | 显示源程序(l+行号 显示第n行) |
b/break 函数名 | 在某函数入口处添加断点 |
b/break 行号 | 在指定行添加断点 |
b/break 文件名:行号 | 在指定文件的指定行添加断点 |
b/break 行号 if 条件 | 当条件为真时,指定行的断点生效 |
info break | 查看所有设置的断点 |
delete 断点编号 | 删除指定断点 |
r/run | 开始运行程序 |
n/next | 单步运行程序(不进入子函数) |
s/step | 单步运行程序(进入子函数) |
c/continue | 继续运行程序 |
p/print 变量名 | 查看指定变量的值 |
finish | 运行程序,直到当前函数结束 |
watch 变量名 | 对指定变量进行监控 |
q/quit | 退出gdb |
5、make、makefile
(1)Linux中使用make来构建和管理自己的软件工程,GNU的make能够使整个软件工程的编译、链接只需要一个命令就可以完成。
(2)make在执行时,需要一个命名为Makefile的文件,Makefile文件描述了整个工程的编译、连接等规则。
(3)Makefile的编写:
a、规则:用于说明如何生成一个或多个目标文件,规则格式为:
targets:prerequisites
command
目标:依赖
命令
命令需要以tab键开始。
b、make命令默认在当前目录下寻找名为makefile或Makefile的工程文件,当名字不为这两者之一时,可以使用如下方法指定文件:make -f 文件名。
c、伪指令:没有任何依赖,只有执行动作的目标。
如:.PHONY:clean
clean:
rm -f hello main.o func1.o func2.o
".PHONY"将"clean"目标声明为伪目标。
d、变量
基本用法:obj=main.o func1.o func2.o
hello:$(obj)
gcc $(obj) -o hello
makefile中,存在系统默认的自动化变量:
$^:代表所有的依赖文件
$@:代表目标
$<:代表每一个依赖文件
makefile中的"#"字符后面的内容被视作注释。
makefile中,“@+命令” 可以取消命令在执行时的回显。