GCC编译
Gcc通过后缀来区别输入文件的类别:
v.c为后缀的文件: C语言源代码文件
v.a为后缀的文件: 是由目标文件构成的库文件
v.C,.cc或.cxx为后缀的文件:是C++源代码文件
v.h为后缀的文件: 头文件
v.i为后缀的文件:是已经预处理过的C源代码文件
v.ii为后缀的文件:是已经预处理过的C++源代码文件
v.o为后缀的文件: 是编译后的目标文件
v.s为后缀的文件: 是汇编语言源代码文件
v.S为后缀的文件: 是经过预编译的汇编语言源代码文件。
编译和运行这段程序
# gcc hello.c -o hello
# ./hello
gcc最基本的用法是∶
gcc [options] [filenames]
options:编译器所需要的编译选项
filenames:要编译的文件名。
编译选项
gcc编译器的编译选项大约有100多个,其中多数我们根本就用不到,这里只介绍其中最基本、最常用的参数。
v-o output_filename:确定可执行文件的名称为output_filename。如果不给出这个选项,gcc就给出预设的可执行文件a.out。(演示)
v-c:只编译,不连接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件。
v-g:产生调试工具(GNU的gdb)所必要的符号信息,要想对编译出的程序进行调试,就必须加入这个选项。
v-O,对程序进行优化编译、链接,采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相应地要慢一些。
v-O2,比-O更好的优化编译、连接,当然整个编译、连接过程会更慢。
-Idirname:将dirname所指出的目录加入到程序头文件目录列表中。
C程序中的头文件包含两种情况∶
#include <A.h>
#include “B.h”
对于<>,预处理程序cpp在系统预设的头文件目录(如/usr/include)中搜寻相应的文件;而对””,cpp在当前目录中搜寻头文件。这个选项的作用是告诉cpp,如果在当前目录中没有找到需要的文件,就到指定的dirname目录中去寻找。
例:gcc foo.c -I /home/include -ofoo
-Ldirname:将dirname所指出的目录加入到库文件的目录列表中。在默认状态下,连接程序ld在系统的预设路径中(如/usr/lib)寻找所需要的库文件,这个选项告诉连接程序,首先到-L指定的目录中去寻找,然后再到系统预设路径中寻找。
v-lname:在连接时,装载名字为“libname.a”的函数库,该函数库位于系统预设的目录或者由-L选项确定的目录下。例如,-lm表示连接名为“libm.a”的数学函数库。
例:gcc foo.c -L /home/lib -lfoo-o foo
v-Wall:生成所有警告信息
v-w:不生成任何警告信息
v-DMACRO:定义MACRO宏,等效于在程序中使用#define MACROGDB是GNU发布的一款功能强大的程序调试工具。
GDB快速进阶
1.编译生成可执行文件:
gcc -g tst.c -o tst
2.启动GDB
gdb tst
3.在main函数处设置断点
break main
4.运行程序
run
5.单步运行
next
6.继续运行
continue
启动GDB
1. gdb调试程序名
例:gdb helloworld
2. gdb
file 调试程序名
GDB命令(演示)
vlist(l) 查看程序
vbreak(b)函数名在某函数入口处添加断点
vbreak(b)行号在指定行添加断点
vbreak(b)文件名:行号在指定文件的指定行添
加断点
vbreak(b)行号if条件当条件为真时,指定行号
处断点生效,例b 5 if i=10,当i等于10时第5行
断点生效
vinfo break 查看所有设置的断点
vdelete断点编号删除断点
vrun(r) 开始运行程序
vnext(n) 单步运行程序(不进入子函数)
vstep(s) 单步运行程序(进入子函数)
vcontinue(c)继续运行程序
vprint(p)变量名查看指定变量值
vfinish 运行程序,直到当前函数结束
vwatch变量名对指定变量进行监控
vquit(q) 退出gdb
GNU make
Makefile(术语)
规则:用于说明如何生成一个或多个目标文件,规则格式如下:
targets : prerequisites
command
目标依赖命令
main.o : main.c
gcc –c main.c
目标?依赖?命令?
make命令默认在当前目录下寻找名字为makefile或者Makefile的工程文件,当名字不为这两者之一时,可以使用如下方法指定:
make–f文件名
Makefile中把那些没有任何依赖只有执行动作的目标称为“伪目标”(phonytargets)。
.PHONY : clean
clean :
rm –f hello main.o func1.o func2.o
“.PHONY”将“clean”目标声明为伪目标
变量
在makefile中,存在系统默认的自动化变量
$^:代表所有的依赖文件
$@:代表目标
$<:代表第一个依赖文件
例:
hello: main.o func1.o func2.o
gcc main.o func1.o func2.o -o hello
=》
hello: main.o func1.o func2.o
gcc $^ -o $@
Makefile中“#”字符后的内容被视作注释。
hello: hello.c
@gcc hello.c –o hello
@:取消回显