makefile:为什么这个简单的makefile只处理第一个源文件?

时间:2013-12-01 03:35:13

标签: c++ makefile

[解决]

我无法让这个简单的makefile正常工作。

这应该将三个源文件NeonAs1.cpp NeonAs2.cpp NeonAs3.cpp构建到'obj'文件夹中的目标文件。

这样可行,但它只会尝试构建NeonAs1.cpp,然后完成而不会出错。

有什么想法吗?

WORKSPACE=../../workspace/
SRC_FOLDER=$(WORKSPACE)/ProjectNeon/
LOCAL_SRC_FILES=NeonAs1.cpp NeonAs2.cpp NeonAs3.cpp

vpath %.cpp $(SRC_FOLDER)

OBJECTS = $(patsubst %.cpp,obj/%.o,$(LOCAL_SRC_FILES)) 

$(OBJECTS): | obj

obj:
    @mkdir -p $@

obj/%.o : %.cpp
    @echo $< 
    @$(CXX) $(CXXFLAGS) -c $< -o $@

clean:
    -rm -f $(LIBRARY) obj/*.o

更新1:如果我添加一个明确的所有目标,如:

all: $(OBJECTS)

然后,如果我做了一个明确的:

make all 

它工作得很好..当我做一个没有'全部'目标的制作时,我怎样才能使它工作


更新2:解决了,我只需要将我的所有目标移到$(OBJECTS)目标之上。

1 个答案:

答案 0 :(得分:0)

make的默认行为是仅构建Makefile中列出的第一个目标。我没有看到早于$(OBJECTS): | obj列出的任何目标。因此,“第一个目标规则”将构建$(OBJECTS)中列出的第一个内容。

要构建所有$(OBJECTS),您需要一个依赖于$(OBJECTS)的最终可执行文件的目标。

要使Makefile符合常规约定,您需要在Makefile中尽早列出一个名为all的目标,该目标也取决于您的可执行文件。这样,当您输入makemake all时,它会构建您的$(OBJECTS)和您的可执行文件。

出于调试目的,您可以添加一个名为debugvars:的目标,该目标只执行@echo OBJECTS=$(OBJECTS)以确保$(OBJECTS)按预期设置。要运行该目标,您可以键入make debugvars。这是一个方便的技巧,我多次使用它来调试Makefile中的变量。