本文衔接上文部分代码。
GNU的Make工具除了提供建立目标的基本功能之外,还有许多其他功能,其中之一就是变量或者宏的定义能力。
program:main.o add.o dec.o div.o mul.o
gcc main.o add.o dec.o div.o mul.o -o program
字符串“main.o add.o dec.o div.o mul.o”被调用了两次,当出现大量程序更改极为不方便。于是这里出现了可以定义变量用来代替大量出现的.o文件名称。
在Makefile文件中可以这样定义:
objects=main.o add.o dec.o div.o mul.o
将代码更改为:
#makefile
objects = main.omain.o add.o dec.o mul.o div.o
program: $(objects)
program: $(objects)
gcc $(objects) -o program
main.o:main.c main.h
gcc -c main.c -o main.o
add.o:add.c
gcc -c add.c -o add.o
dec.o:dec.c
gcc -c dec.c -o dec.o
mul.o:mul.c
gcc -c mul.c -o mul.o
div.o:div.c
gcc -c div.c -o div.o
clean:
rm *.o program
效果图:
之后如果有新的.o文件加入,只需要修改objects变量即可。
在Makefile中定义变量中有两种形式,一种是递归展开方式,另一种是简单方式。
Make中变量格式是:$(VAR)
Makefile中变量分为用户自定义变量,预定义变量,自动变量及环境变量。如objects是用户自定义变量,关于其他三个变量在网上都可以查到,在此不多赘述。
自动变量中:
$^ 所有不重复的依赖文件,都以空格分开
$@ 目标文件的完整名称
我编写一个makefile文件,在文件中引入预定义变量“CC”和“CFLAGS”,自动变量“$^”和“$@”。对于初学者很难,熟练掌握之后,就会发现这样增加了makefile编写灵活度。
#makefile
objects = main.omain.o add.o dec.o mul.o div.o
program: $(objects)
CC=gcc
CFLAGS=-Wall -O -g
program: $(objects)
$(CC) $(CFLAG) -o $@
main.o:main.c main.h
$(CC) $(CFLAG) -c main.c -o main.o
add.o:add.c
$(CC) $(CFLAG) -c add.c -o add.o
dec.o:dec.c
$(CC) $(CFLAG) -c dec.c -o dec.o
mul.o:mul.c
$(CC) $(CFLAG) -c mul.c -o mul.o
div.o:div.c
$(CC) $(CFLAG) -c div.c -o div.o
clean:
rm *.o program