005-makefile、gdb
本帖最后由 moc 于 2018-10-26 08:57 编辑1、make工具
1. 简介
① make 是安装有GNU Make的计算机上的可执行指令,该指令读入一个名为makefile的文件,然后执行这个文件中指定的指令。
② Makefile文件描述了整个工程的编译、连接等规则。
③ 利用 make可自动完成编译工作。
这些工作包括:如果仅修改了某几个源文件,则只重新编译这几个源文件;如果某个头文件被修改了,则重新编译所有包含该头文件的源文件。
利用这种自动编译可大大简化开发工作,避免不必要的重新编译。
2. Makefile基本规则
规则是Makefile中的核心内容,一个基本的规则如下:
TARGET … : DEPENDENCIES …
COMMAND
…
示例:
mycalc:add.c sub.c mul.c div.c
gcc add.c sub.c mul.c div.c -o mycalc
规则的三要素: 目标(target)、依赖(dependencies)、命令(command)。
目标: 程序产生的文件,如可执行文件和目标文件;目标也可以是要执行的动作,如clean,也称为伪目标(.PHONY:clean)。
依赖: 是用来产生目标的输入文件列表,一个目标通常依赖于多个文件。
命令:是make执行的动作(命令是shell命令或是可在shell下执行的程序)。
注意:每个命令行的起始字符必须为TAB字符!
3. Make工具的最核心思想
如果DEPENDENCIES中有一个或多个文件更新的话,就需要重新生成TARGET,进而执行COMMAND命令。
判别更新的依据: 根据依赖和目标的修改时间,如果依赖时间较新则需要重新生成,否则不需要。
4. make自定义变量、自动变量、模式规则、后缀规则等
① 普通自定义变量
obj = main.c add.c
obj += mul.c div.c(变量追加值)
② Makefile维护的变量
通常格式为大写, 有些有默认值有些没有, 用户可以修改这些变量。
CC:默认值 cc
CPPFLAGS: 预处理器需要的选项 如 -I
CFLAGS: 编译的时候使用的参数 -Wall -g -c
LDFLAGS: 链接库使用的选项 -L-l
③ 自动变量
$@==>规则中的目标
$<==>规则中的第一个依赖
$^==>规则中所有的依赖
上面的自动变量只能在规则命令中使用。
④ 模式规则
%.o:%.c
%任意一个或多个字符,一旦第一个%确定下来了,第二个就跟着确定了。
.c.o: # 就是上面%.o:%.c的简写形式
5. make函数
1. $(value)
表示取出变量的值
2. $(function arguments)
make中的函数调用, function为函数名,arguments为函数参数。
wildcard pattern ==>指定目录下匹配模式的文件.
例如:src=$(wildcard *.c), 查找当前目录下的.c文件,存入src变量。
patsubst pattern,preplacement,text==> 模式替换函数
例如:$(patsubst %.c,%.o,$src), 将src中所有的.c替换为.o,等价于$(src:.c=.o)。
执行shell命令:
例如: $(shell ls –d */)
6. make执行
makefile文件示例:
# obj=main.o add.o sub.o mul.o
target=app
src=$(wildcard ./*.c)
obj=$(patsubst ./%.c, ./%.o, $(src))
CC = gcc
CPPFLAGS = -I
$(target):$(obj)
$(CC) $(obj) -o $(target)
%.o:%.c
$(CC) -c $< -o $@
.PHONY:clean
clean:
rm $(obj)$(target)-f
hello:
echo "hello, makefile"
在makefile同级目录下,直接输入make即可执行,生成最终目标。
如果只想只想某条规则,可以=>make目标, 如: make clean
2、gdb工具
页:
[1]