基本的 makefile 规则是这样的:
目标(target):目标文件1 目标文件2
<tab> gcc -o 欲建立的执行文件 目标文件1 目标文件2
目标(target)就是我们想要建立的信息,目标文件是具有关联性的,建立执行文件的语法是以<tab>按键开头的那一行。特别注意,“命令行必须要以tab按键作为开头”。它的规则基本上是这样的:
- makefile 中的 # 表示注释;
- <tab> 要在命令行的第一个字符;
- 目标(target)与目标文件之间以 : 隔开。
# 1. 先建立编译的规则
$ vi makefile
main: main.o haha.o sin_value.o cos_value.o
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
clean:
rm -f main main.o haha.o sin_value.o cos_value.o
# 2. 测试
$ make clean
rm -rf main main.o haha.o sin_value.o cos_value.o
如此一来,我们的 makefile 中就至少有两个目标,分别是 main 与 clean。如果想建立 main,输入 make main;如果想清除,输入 make clean。如果想先清除目标文件再编译 main 文件,可以输入 make clean main,如下所示:
$ make clean main
rm -rf main main.o haha.o sin_value.o cos_value.o
cc -c -o main.o main.c
cc -c -o haha.o haha.c
cc -c -o sin_value.o sin_value.c
cc -c -o cos_value.o cos_value.c
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
我们可以再通过 shell 脚本的 变量 来简化 makefile:
$ vi makefile
LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
main: $(OBJS)
gcc -o main $(OBJS) $(LIBS)
clean:
rm -rf main $(OBJS)
变量的基本语法为:
- 變數與變數內容以 = 隔開,同時兩邊可以具有空格;
- 變數左邊不可以有 <tab> ,例如上面範例的第一行 LIBS 左邊不可以是 <tab>;
- 變數與變數內容在 = 兩邊不能具有 : ;
- 在習慣上,變數最好是以 大寫字母 為主;
- 運用變數時,以 ${變數} 或 $(變數) 使用;
- 在該 shell 的環境變數是可以被套用的,例如提到的 CFLAGS 這個變數!
- 在命令行模式也可以給予變數。
由于 gcc 在进行编译时,会主动读取 CFLAGS 环境变量,所以,可以直接在 shell 定义出这个环境变量,也可以在 makefile 文件里定义,更可以在命令行中提供,例如:
// method 1
$ CFLAGS="-Wall" make clean main
// method 2
$ vi makefile
LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
CFLAGS = -Wall
main: $(OBJS)
gcc -o main $(OBJS) $(LIBS)
clean:
rm -rf main $(OBJS)
环境变量取用的规则是这样的:
- make 命令行后面加上的环境变量优先;
- makefile 里指定的环境变量第二;
- shell 原有的环境变量第三。
此外,还有一些特殊的变量是需要了解的:
$@:表示当前的目标(target),所以,也可以将 makefile 改成:
$ vi makefile
LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
CFLAGS = -Wall
main: $(OBJS)
gcc -o $@ $(OBJS) $(LIBS) # 这个$@就是main
clean:
rm -rf main $(OBJS)