patsubst和编译源文件

时间:2016-01-19 17:39:40

标签: 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 $@

但只有$(SRC)中的第一个文件被编译并将对象放在./obj

g++ -std=c++11 -c Connection.cpp -o obj/Connection.o

我在这里缺少什么? 感谢。

1 个答案:

答案 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)