-
认识Makefile
Make工具的使用格式:
make[options] [target]
选 项 |
含 义 |
-ffilename |
显式地指定文件作为Makefile |
-Cdirname |
制定make在开始运行后的工作目录为dirname |
-e |
不允许在Makefile中替换环境变量的赋值 |
-k |
执行命令出错时,放弃当前目标,继续维护其他目标 |
-n |
按实际运行时的执行顺序模拟执行命令(包括用@开头的命令),没有实际执行效果,仅仅用于显示执行过程 |
-p |
显示Makefile中所有的变量和内部规则 |
-r |
忽略内部规则 |
-s |
执行但不显示命令,常用来检查Makefile的正确性 |
-S |
如果执行命令出错就退出 |
-t |
修改每个目标文件的创建日期 |
-I |
忽略运行make中执行命令的错误 |
-V |
显示make的版本号 |
Makefile的常用变量:
变量 |
描述 |
$@ |
目标文件名 |
$< |
规则中的第一个文件名 |
$^ |
规则中所有的依赖文件名 |
$? |
规则中日期比目标新的文件列表,用空格隔开 |
$(@D) |
目标文件的目录部分 |
$(@F) |
目录文件的文件名部分 |
在Makefile中,目标名称的指定常常有以下惯例:
all:表示编译所有的内容,是执行make时默认的目标。
clean:表示清除目标。
distclean:表示清除所有的内容。
install:表示进行安装的内容。
-
Makefile的使用范例
-
最简单的例子
all:
@echo"+++++++ make all +++++++"
rule0:
@echo"Input = $(INPUT)"
@echo'This Target is $@'
.PHONY: clean
clean:
@echo"------- clean ------"
-
Makefile中的依赖关系
all:rule0file.o rule0:rule1 @echo"+++++++ rule0 +++++++" @echo'The deps:$^' @echo'The target:$@' rule1:rule2 @echo"+++++++ rule1 +++++++" rule2:rule3 @echo"+++++++ rule2 +++++++" rule3: @echo"+++++++ rule3 +++++++" file.o: @echo"1234567890" > file.o @echo"File path: $(@D) File name : $(@F)" .PHONY: clean rule0 rule1 rule2 rule3 clean: @echo"------- clean ------" rm -f file.o |
Makefile的执行顺序不是按照每条规则书写的先后顺序,而是由规则之间的依赖关系确定的。在Makefile中,将目标cleanrule0 rule1 rule2rule3定义为伪目标(.PHONY),这是由于它们不是需要生成的内容的名称;file.o是实际生成的结果,因此它是真实的目标,而不是伪目标。
-
Makefile的隐含规则
CC := gcc HEAD := getarg.h SRC := getarg.c writeinfo.o main.c OBJS := getarg.o writeinfo.o main.o TT := test Files:= $(wildcard ./*) INC= . CFLAGS = -pipe -g -Wall -I$(INC) LDFLAGS= -Wall -g
all:$(TT) $(TT):$(OBJS) @echo"+++++++ Build Standalone Programe : $@ +++++++" $(CC)$(LDFLAGS) $(OBJS) -o $@ libtest_d.so:getarg.owriteinfo.o @echo"+++++++ Build Dynamic lib : $@ +++++++" $(CC)-shared $(LDFLAGS) getarg.o writeinfo.o -o $@
test_dlib:libtest_d.somain.o @echo"+++++++ Build Exe by Dynamic lib : $@ +++++++" $(CC)$(LDFLAGS) main.o -L. -ltest_d -o $@
filelist: @echo"<<<<<<< Files in this folder >>>>>>" @file$(Files)
.PHONY: clean filelist
%.o:%c $(CC)$(CFLAGS) -c $< -o $@ clean: @echo"------- clean ------" rm-f *.o rm-f $(TT) rm-f libtest_d.so rm -f test_dlib |