这是我目前存在的makefile
SRC=src
HDS=header
DRV=drivers
FILES=arraystack arraylist pointerstack pointerlist
FLAGS=-w -I $(HDS)
.PHONY: timing all $(FILES)
.DEFAULT_GOAL:=all
$(FILES): % :$(DRV)/%_driver.cpp $(HDS)/%.h $(SRC)/%.cpp
g++ $(FLAGS) $^ -o $@ && ./$@ && rm $@
timing:
g++ $(FLAGS) $^ -i $@ && ./$@ && rm $@
all: $(FILES) timing
目标时序需要依赖于arraystack.cpp,arraystack.h,arraylist.cpp,arraylist.h,pointerstack.cpp,pointerstack.h,pointerlist.cpp和pointerlist.h。另外,这些文件位于不同的目录中 - .h文件位于header /,。cpp文件位于src /中。有没有办法让make根据某种模式匹配自动拥有这些需求,从我在我的变量中拥有根文件名的现有列表?它似乎是一个比8 .h和.cpp文件列表更优雅的解决方案。
答案 0 :(得分:2)
使用一些text manipulation functions,您可以首先根据您的目录和FILES
列表构建标题和源文件列表:
HDS_FILES = $(addsuffix .h,$(addprefix $(HDS)/,$(FILES)))
SRC_FILES = $(addsuffix .cpp,$(addprefix $(SRC)/,$(FILES)))
DRV_FILES = $(addsuffix _driver.cpp,$(addprefix $(DRV)/,$(FILES)))
然后,添加没有配方的目标来指定源,驱动程序和头文件之间的依赖关系:
$(SRC)/%.cpp: $(HDS)/%.h
$(SRC)/%_driver.cpp: $(HDS)/%.h
添加转换目标以将源文件和驱动程序文件编译为目标文件:
%.o: $(SRC)/%.cpp
g++ -c $(FLAGS) $^ -o $@
%_driver.o: $(DRV)/%_driver.cpp
g++ -c $(FLAGS) $^ -o $@
构建所有目标文件的列表,并为timing
可执行文件创建最终规则:
OBJS = $(addsuffix .o,$(FILES)) $(addsuffix _driver.o,$(FILES))
timing: $(OBJS)
g++ $(FLAGS) $^ -o $@
提示1 :在调整Makefile时,使用$(info ...)
函数检查变量的内容而不影响您的依赖关系图,它有助于发现文本转换内容中的错误。
$(info HDS_FILES = $(HDS_FILES))
$(info SRC_FILES = $(SRC_FILES))
$(info DRV_FILES = $(DRV_FILES))
$(info OBJS = $(OBJS))
提示2 :您可以在配方中的不同行上指定多个操作,而不是使用内置的&&
内嵌的内容:
<some target>:
g++ $(FLAGS) $^ -o $@ && ./$@ && rm $@
# Is (almost) equivalent to and clearer than
<some target>:
g++ $(FLAGS) $^ -o $@
./$@
rm $@