[解决]
我无法让这个简单的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)目标之上。
答案 0 :(得分:0)
make的默认行为是仅构建Makefile中列出的第一个目标。我没有看到早于$(OBJECTS): | obj
列出的任何目标。因此,“第一个目标规则”将构建$(OBJECTS)
中列出的第一个内容。
要构建所有$(OBJECTS)
,您需要一个依赖于$(OBJECTS)
的最终可执行文件的目标。
要使Makefile符合常规约定,您需要在Makefile中尽早列出一个名为all
的目标,该目标也取决于您的可执行文件。这样,当您输入make
或make all
时,它会构建您的$(OBJECTS)
和您的可执行文件。
出于调试目的,您可以添加一个名为debugvars:
的目标,该目标只执行@echo OBJECTS=$(OBJECTS)
以确保$(OBJECTS)
按预期设置。要运行该目标,您可以键入make debugvars
。这是一个方便的技巧,我多次使用它来调试Makefile中的变量。