2017-02-14 32 views
1

这里是我的makefile,因为它目前存在如何为.cpp和.h文件从变量生成依赖关系?

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 [email protected] && ./[email protected] && rm [email protected] 

timing: 
    g++ $(FLAGS) $^ -i [email protected] && ./[email protected] && rm [email protected] 

all: $(FILES) timing 

目标时间需要靠arraystack.cpp,arraystack.h,arraylist.cpp,arraylist.h,pointerstack.cpp,pointerstack.h,pointerlist.cpp ,和pointerlist.h。此外,这些文件位于不同的目录中 - .h文件位于标题/中,.cpp文件位于src /中。有没有一种方法可以让make根据某种模式匹配自动生成这些需求,这些需求来自于我的变量中具有根文件名的现有列表?这似乎是一个更优雅的解决方案,而不是一个8 .h和.cpp文件列表应该可用。

+0

当你的依赖性问题很好说,你是什么:你可以在一个配方,而不是使用shell内置&&分行指定多个动作试图用这个Makefile实现并不是很清楚:你为什么试图执行('... && ./[email protected] && ...')你的食谱产品? 请参阅我的回答下面与依赖图相关的问题,并编辑您的问题/相应地创建一个新的问题,如果您有其他需求 –

回答

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 [email protected] 

%_driver.o: $(DRV)/%_driver.cpp 
    g++ -c $(FLAGS) $^ -o [email protected] 

构建所有目标文件的列表,并为您的timing可执行文件创建最终的规则:

OBJS = $(addsuffix .o,$(FILES)) $(addsuffix _driver.o,$(FILES)) 

timing: $(OBJS) 
    g++ $(FLAGS) $^ -o [email protected] 

提示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 [email protected] && ./[email protected] && rm [email protected] 

# Is (almost) equivalent to and clearer than 
<some target>: 
    g++ $(FLAGS) $^ -o [email protected] 
    ./[email protected] 
    rm [email protected] 
+0

这似乎正是我需要的,虽然稍微过度设计以供我使用。我可以通过我自己的方式解决它 '计时:$(文件:%= $(SRC)/%。cpp)$(文件:%= $(HDS)/%。h)$(DRV)/ timing.cpp' 并感谢关于多线的提示,出于某种原因,我在印象下只允许单线。不知道我从那里得到了什么。 –