基本的语法规则是:
target ... : prerequisites ...
command
...
...
target也就是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label)。
prerequisites就是,要生成那个target所需要的文件。
command也就是make需要执行的命令。(任意的Shell命令)
prerequisites中如果有一个以上的文件比target文件要新(修改日期)的话,command所定义的命令就会被执行。
edit : main.o kbd.o command.o display.o / insert.o search.o files.o utils.o cc -o edit main.o kbd.o command.o display.o / insert.o search.o files.o utils.o main.o : main.c defs.h cc -c main.c kbd.o : kbd.c defs.h command.h cc -c kbd.c command.o : command.c defs.h command.h cc -c command.c display.o : display.c defs.h buffer.h cc -c display.c insert.o : insert.c defs.h buffer.h cc -c insert.c search.o : search.c defs.h buffer.h cc -c search.c files.o : files.c defs.h buffer.h command.h cc -c files.c utils.o : utils.c defs.h cc -c utils.c clean : rm edit main.o kbd.o command.o display.o / insert.o search.o files.o utils.o
make执行的过程类似于递归搜索,edit依赖于main.o,当它找不到main.o,则会去找main.o所需要的依赖。
反斜杠(/)是换行符的意思。
cc 是unix编译器,与gcc不同的是,它只能编译c语言,不能编译c++。
执行cc -c xx.c 生成的二进制文件名就是xx.o。
target就是:前的,prerequisites就是:后的。
命令以table开头,make会比较targets文件和prerequisites文件的修改日期,如果prerequisites文件的日期要比targets文件的日期要新,或者target不存在的话,那么,make就会执行后续定义的命令。
由于clean没有prerequisite,它只是一个动作,需要手动去make clean 执行。
objects = main.o kbd.o command.o display.o \ insert.o search.o files.o utils.o source_files = -c \
main.c kbd.c commond.c \
display.c files.c utils.c insert.c
head_dirs = -I ./
all:$(objects)
%.o:%.c
gcc $(head_dirs) $(source_files)
gcc $(objects) $(head_dirs) -o test
.PHONY : clean clean : rm edit $(objects)
定义变量并引用:
.PHONY : clean 表示clean是个伪目标。
make先执行 all:$(objects)
%是一个通配符。
然后执行 %.o:%.c
然后执行两个编译命令。
编译选项:
-Wall:选项可以打印出编译时所有的错误或者警告信息。
-O0: 表示编译时没有优化。
-O1: 表示编译时使用默认优化。
-O2: 表示编译时使用二级优化。
-O3: 表示编译时使用最高级优化。
-Os:相当于-O2.5优化,但又不所见代码尺寸。