据我所知,我的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 $@
但只有$(SRC)中的第一个文件被编译并将对象放在./obj
中g++ -std=c++11 -c Connection.cpp -o obj/Connection.o
我在这里缺少什么? 感谢。
答案 0 :(得分:1)
makefile中只能有一个默认目标。
在Arguments to Specify the Goals部分的GNU制作手册中讨论了控制默认目标。
对于这个问题,关键的一点是:
默认情况下,目标是makefile中的第一个目标(不计算以句点开头的目标)。
在您的情况下,默认目标因此是obj/Connection.o
,因为您的makefile的这一位
$(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
与
.PHONY: all
all: $(OBJS)