moc 发表于 2018-10-25 15:52:07

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]
查看完整版本: 005-makefile、gdb