自动化Build的方法如下所示

xiaoxiao2021-02-28  95

#本文件自动进行build。 ##########修改如下内容进行自定义。####### PROGRAM := hello.exe SRCDIRS :=. SRCEXTS :=.cpp ######################################### SOURCES := $(foreach d,$(SRCDIRS),$(wildcard $(addprefix $(d)/*,$(SRCEXTS)))) OBJS := $(foreach x,$(SRCEXTS), \ $(patsubst %$(x),%.o,$(filter %$(x),$(SOURCES)))) DEPS = $(patsubst %.o,%.d,$(OBJS)) .PHONY : all obj all : $(PROGRAM) $(PROGRAM) : $(OBJS) g++ -o $(PROGRAM) $(OBJS) objs : $(OBJS) %.d: %.cpp g++ -MM -MD $< -include $(DEPS)

 

 关于%和*的不同:下面这段话仔细品味:   一个是变量(所有的%代表的是相同的字符串,以第一次匹配上为标准),一个是通配。   一般我们可以使用“$(wildcard *.c)”来获取工作目录下的所有的.c文件列表。复杂一些用法;可以使用“$(patsubst %.c,%.o,$(wildcard *.c))”,首先使用“wildcard”函数获取工作目录下的.c文件列表;之后将列表中所有文件名的后缀.c替换为.o。这样我们就可以得到在当前目录可生成的.o文件列表。因此在一个目录下可以使用如下内容的Makefile来将工作目录下的所有的.c文件进行编译并最后连接成为一个可执行文件:   #sample Makefile   objects := $(patsubst %.c,%.o,$(wildcard *.c))   foo : $(objects)   cc -o foo $(objects)   这里我们使用了make的隐含规则来编译.c的源文件。对变量的赋值也用到了一个特殊的符号(:=)。关于变量定义可参考6.2 两种变量定义一节。函数“patsubst”可参考8.2 文本处理函数一节   #关于.d文件。有这两段话,帮助理解为何生成.d文件   ---makefile的包含   “include”指示符告诉make暂停读取当前的Makefile,   而转去读取“include”指定的一个或者多个文件,   完成以后再继续当前Makefile的读取。   ---makefile的更新(包括自我更新)   make在读入所有makefile文件之后,   首先将所读取的每个makefile作为一个目标,   寻找更新它们的规则。   如果存在一个更新某一个makefile文件明确规则或者隐含规则,   就去更新对应的makefile文件。  

转载请注明原文地址: https://www.6miu.com/read-76426.html

最新回复(0)