Makefile patsubst和编译源文件

Makefile patsubst和编译源文件,makefile,gnu-make,Makefile,Gnu Make,据我所知,makefile中的以下几行应该编译当前目录中的所有源文件 SRC=Connection.cpp Request.cpp SessionHandler.cpp OBJS=$(patsubst %.cpp,obj/%.o,$(SRC)) $(OBJS) : | obj obj: @mkdir -p $@ obj/%.o : %.cpp g++ -std=c++11 -c $< -o $@ 我错过了什么? 谢谢。一个makefile中只能有一个默认

据我所知,makefile中的以下几行应该编译当前目录中的所有源文件

SRC=Connection.cpp Request.cpp SessionHandler.cpp
OBJS=$(patsubst %.cpp,obj/%.o,$(SRC))

$(OBJS) : | obj
obj:
        @mkdir -p $@
obj/%.o : %.cpp
        g++ -std=c++11 -c $< -o $@
我错过了什么?
谢谢。

一个makefile中只能有一个默认目标

控制默认目标在本节的GNU Make手册中进行了讨论

对于这个问题,关键在于:

默认情况下,目标是makefile中的第一个目标(不计算以句点开头的目标)

因此,在您的情况下,默认目标是
obj/Connection.o
,因为生成文件的这一位

$(OBJS) : | obj
扩展到

obj/Connection.o obj/Request.o obj/SessionHandler.o: | obj
这相当于

obj/Connection.o: | obj
obj/Request.o: | obj
obj/SessionHandler.o: | obj
要在默认情况下生成所有要替换的对象文件

$(OBJS) : | obj

$(OBJS) : | obj
.PHONY: all
all: $(OBJS)