为了提高编译程序的效率,很多基于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 变量名 :查看变量当前值