1,学习makefile的写法
target:prerequisites
command
target也就是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label),对于标签这种特性,在后续的“伪目标”章节中会有叙述。
prerequisites就是,要生成那个target所需要的文件或是目标。
command也就是make需要执行的命令。(任意的Shell命令)
如:
INCL=-I$(HOME)/include
LIB=-L$(HOME)/lib
main:main.o
main.o:main.c
cc -o main main.c
clean:
rm main.o
又如:
INCL=-I$(HOME)/include
LIB=-L$(HOME)/lib
all: main
main:main.c
cc -o main main.c
clean:
rm main.o
以上用的有中间文件 main.o,也可能不用
INCL=-I$(HOME)/include
LIB=-L$(HOME)/lib
main:main.c
cc -o main main.c
clean:
rm main.o
2.定义变量,把中间.o文件定义成变量
INCL=-I$(HOME)/include
LIB=-L$(HOME)/lib
OBJ=main.o
main:$(OJB)
main.o:main.c
cc -o main $(OJB)
clean:
rm main.o
3.清空
INCL=-I$(HOME)/include
LIB=-L$(HOME)/lib
OBJ=main.o
main:$(OJB)
main.o:main.c
cc -o main $(OJB)
clean:
rm main $(OJB)
更好的做法是
.PHONY clean:
-rm main $(OJB)
这里
.PHONY告诉clean是一个伪目标
-rm的意思:如果有文件出现问题,但不要管,往下删
4.自动化变量
$@---表示规则中的目标文件集。在模式规则中,如果有多个目标,那么,"$@"就是匹配于目标中模式定义的集合。
如:
main:$(OBJ)
cc -o $@ $(OBJ)
和
main:$(OBJ)
cc -o main $(OBJ)
也就是说 $@相当于 main
5,完整的makefile
INCL=-I$(HOME)/include
LIB=-L$(HOME)/lib
all: main clean
CL=/opt/K/SCO/unixds/5.1.2A/usr/ccs/bin/cc
OBJ=main.o
main:$(OBJ)
@$(CL) -o $@ $(OBJ)
@mv $@ $(HOME)/lib
@echo 编译完毕
.PHONY clean:
rm $(OBJ)
@echo 清除*.o文件