个人笔记系列:
认识makefile里面常用变量:
- $^
- $@
- $?
- $<
变量一: $^
所有的依赖的目标的集合,如果存在重复依赖目标的,那么这个变量就会去除掉重复的。就是剩下的所谓的目标的所有集合。
PS:什么是目标文件,什么是依赖目标文件????
hell.o:main.c
gcc main.c -c hello.o
注:目标文件就是hello.o 依赖于main.c 。全文意思就是hello.o是依赖于main.c所生成的,
下面是表达怎么生成这么hello.o文件呢?是通过gcc 编译生成的。
常用实例一、
deco:main.o temp_1.o temp_2.o temp_3.o
gcc -o deco temp_1.o temp_2.o temp_3.o
使用我们的定义符之后,减少了很多的工作
deco:main.o temp_1.o temp_2.o temp_3.o
gcc -o deco $^
由上面可以看到$^ 就等于上面的所有的依赖目标(temp_1.o temp_2.o temp_3.o)
变量二: $@
表示目标文件的集合,要是编译多目标,那么就相当于匹配目标中模式定义的集合。
常用实例二、
deco:main.o temp_1.o temo_2.o temp_3.o
gcc -o deco $^
使用这个定义符之后表达为
deco:main.o temp_1.o temo_2.o temp_3.o
gcc -o $@ $^
我们的目标文件是 deco 可以有$@替代
变量三: $?
一般在编程上面看到问号,不自觉地想象它是一个带有比较功能的符号,在这个也的确如此。它表示比目标还要新的依赖文件列表 。这里面关系到makefile的一个时间戳概念。意义就是进行更新时间的比较,一般在更新库或者日志这方面用到。
常用实例三、
lib_dev:main.o temp_1.o temp_2.o
ar -r lib_dev $?
意思就是更新依赖文件的集合,(ar -r) 链接库如果依赖目标在则替换它,如果不在
就加进最后一次修改过的依赖目标。如果temp_1.o更新了,那么$?集合里面只有
temp_1.0,如果main.o temp_1.o都更新了,那么集合里面即有main.o 和 temp_1.o.
变量四: $<
1、依赖目标中的第一个目标,
2、如果依赖目标是以模式定义的,那么这个定义符是符合模式的一系列的文件集 合。分成两段概念来看这个定义符。
首先实现第一段概念:实例4.1
hello.o:main.c sys_dev.c sys_lib.c
gcc -c hello.o $<
这里使用的 $< 依赖目标中的第一个目标,也就是实例中的 main.c 然后编译成hello.o,其他的依赖就不进行编译了。
咋一看这个这样的用法好像有点神经病啊。请看下一个实例
实现第二段概念:实例4.2 ps:(%.o == 所有的.o文件),(%.c == 所有的.c 文件),
%.o:%.c
gcc -o $@ $<
那么在上面实例中$<是代表在一个一个地将.c文件取出来进行编译。有多少个.c文件 那么就对 应着生成多少个.o文件。
实例4.2将其转换成平常写法:假设只有三个.c的文件,实例4.2的作用等同于下面实例4.3.
实例4.3:
sys_dev.o:sys_dev.c
gcc -c sys_dev.o sys_dev.c
sys_serve.o:sys_serve.c
gcc -o sys_serve.o sys_serve.c
sys_bin.c:sys_bin.c
gcc -o sys_bin.o sys_bin.c
运行过后就会产生三个.o的文件。和实例4.2的作用是一样的。