makefile-gdb文件
可以在文件中指定那些文件可以先进行编译,那些文件可以后进行编译,那些文件可以重新编译。他可以自动化编译程序。。。。
6-1 makefile基本规则
如下:
目标: 依赖
(tab) 命令
规则三要素:
目标:要生成的目标文件。
依赖:目标文件由那些文件生成。
命令:执行命令以便生成目标。
例子: makefile的第一种写法:
这样写的效率最低,修改一个文件时,所有文件都会重新编译。
6-2 makefile的工作原理
如果想要生成目标,则检查规则中的依赖是否都存在,如果不存在向下寻找,看看有没有生成该依赖文件 的规则,如果有则先生成该依赖,然后再回到刚才的地方生成目标。如果没有则报错
如果想要生成目标的依赖都存在,则检查规则中的目标是否要更新,而且要先检查该目标的依赖是否有更 新,如果有则必须更新该目标。也就是依赖比目标新 更新目标文件
例子:makefile的第二种写法:
上图中,如果要生成可执行文件main则需要满足四个依赖,很显然在第一行四个依赖都不满足,于是向 下寻找缺少的依赖是否也需要被生成。然后就发现main的依赖之一main.o需要又一个依赖main.c来生成。 然后生成main.o文件。以此类推。上图代码过于冗余,不建议怎么写。
6-3 makefile中的变量
makefile中有三种变量:普通变量,自带变量,自动变量。
普通变量:
定义变量时使用“=”
使用变量时应该这样:$(变量名)
例子:
acr = test.txt //定义变量acr并且为其赋值
bar = $(test.txt) //定义变量baar,并且使用之前的acr变量为其赋值
makefile中有一些固定的变量可以让用户直接使用,我们可以为其赋值。
CC = gcc #arm-linux-gcc
CPPFLGS : //C预处理的选项 -I (大写i)
CFLGS: //C预编译的选项 -Wall -g -c
LDFLAGS: //链接器选项 -L -l
自动变量:(只能在规则的命令中使用)
$@: 表示规则中的目标
$<: 表示规则中的第一个条件
$^: 表示规则中的所有条件,组成一个列表,以空格分隔开,如果列表中有相同项这会消除相同项。
模式规则:
至少在规则的目标定义中要包含’%’, ‘%’表示一个或多个, 在依赖条件中同样可以使用’%’, 依赖条件中的’%’的 取值取决于其目标:
比如: main.o:main.c fun1.o: fun1.c fun2.o:fun2.c, 说的简单点就是: xxx.o:xxx.c
例子:markfile文件的第三种写法:
上图markfile文件解析:
1.定义一个变量target 并且为其赋值为main(main是可执行程序的名字)
定义一个变量object 并且为其赋值。(赋值内容为main的依赖条件)
使用自带的CC变量,并且为其赋值。
使用自带的CPPFLAGS变量,并且为其赋值。(这个变量是 预处理-I的那个参数)
2.$(target) : $ (object) 这里是使用变量。
上述内容展开后如下:main:main.o fun1.o fun2.o sum.o
3.$(CC) -o $@ $^ 这里先使用了CC变量,然后使用自带变量$@表示当前规则中的目标,也就是object 变量的值,$^表示要逐个取用规则中的目标,如果有重复则消除重复。
上述内容展开后如下:gcc -o main.o fun1.o fun2.o sum.o
4.%.o:%.c 这里表示生成一个或多个.o目标文件需要一个或多个%.c依赖
5.$(CC) -o $@ -c %< $(CPPFLAGS) 这个不多说,我们直接展开
上述内容展开后如下:gcc -o main.o fun1.o fun2.o sum.o -c main.c fun1.c fun2.c sum.c
6-4 makefile函数
以下是常见函数:
1.wildcard 查找指定目标下的指定类型的文件,例如:scr=$(wildcard *.c) 可以将当前目录下所以后缀为.c的文件赋值给src。
2.patsubst 匹配替换,例如:obj=$(patsubst %.c,%.o,$(src)) 把变量src中所有后缀为.c的文件替换成.o。
通过以上代码,发现这里的函数也会有返回值。
例子:markfile的第四种写法:
上图的makefile文件的解析:
现在假设当前目录想有源文件one.c 和 two.c
1.src=$(wildcard ./*.c) 这里使用wildcard来搜索当前目录下的所有后缀为.c的文件,并且将其赋值给 src。此时src等于oen.c two.c
2.object=$(patsubst %c,%.o,$(src)) 这里通过patsubst;来将变量src中所有.c替换为.o,替换完成后变 量src的值为 one.o two.o
3.定义一个普通变量target,并且为其赋值为main
4.使用自带的CC变量CPPFLAGS变量,并且为其赋值
5.$(target)
标签:文件,13,07,makefile,MakeFile,two,目标,main,变量 From: https://www.cnblogs.com/xiaobai1523/p/17962495