对于.cpp和.h文件,如何从变量生成make依赖项?

时间:2017-02-14 23:51:13

标签: c++ makefile

这是我目前存在的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文件列表更优雅的解决方案。

1 个答案:

答案 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 $@