Makefile GNU Make中通配符目标的正确方法

Makefile GNU Make中通配符目标的正确方法,makefile,wildcard,gnu-make,target,Makefile,Wildcard,Gnu Make,Target,我正在尝试编写一个Makefile,将源文件和目标文件分开,但我似乎无法找到正确的方法来实现这一点。我有两种方法,但我希望有人能指出正确的方法 我的项目被分成一个src和obj文件夹,其中Makefile与这些文件夹处于同一级别 第一种方法使用通配符函数在src中查找源文件,然后使用文本替换来确定相应的目标文件 SRC = $(wildcard src/*.cpp) OBJ = $(SRC:.cpp=.o) prog: $(OBJ) $(CC) $(CFLAGS) $(LDFLA

我正在尝试编写一个Makefile,将源文件和目标文件分开,但我似乎无法找到正确的方法来实现这一点。我有两种方法,但我希望有人能指出正确的方法

我的项目被分成一个
src
obj
文件夹,其中Makefile与这些文件夹处于同一级别

第一种方法使用通配符函数在
src
中查找源文件,然后使用文本替换来确定相应的目标文件

SRC = $(wildcard src/*.cpp)
OBJ = $(SRC:.cpp=.o)

prog: $(OBJ)
       $(CC) $(CFLAGS) $(LDFLAGS) $(LIBS) -o prog $(patsubst src/,obj/,$(OBJ))

%.o: %.cpp
     $(CC) $(CFLAGS) -c $< -o $(COMPILE)/$(@F)  
这消除了对象文件的重新编译,但要求我为
prog
目标添加另一个变量
POJB
(因为没有basedir,我无法仅对对象文件执行任何patsubst)


这两种方法都有效,而且每种方法都有各自的优势,但哪种方法是“正确的”方法?如果两者都不正确,那么实现这类建筑的正确方法是什么?

您的第一个示例几乎就在这里:

SRC = $(wildcard src/*.cpp)
OBJ = $(patsubst src/%.cpp, obj/%.o, $(SRC))

prog: $(OBJ)
  $(CC) $(CFLAGS) $(LDFLAGS) $(LIBS) $(OBJ) -o prog 

obj/%.o: src/%.cpp
  $(CC) $(CFLAGS) -c $< -o $@
SRC=$(通配符SRC/*.cpp)
OBJ=$(patsubst src/%.cpp,OBJ/%.o,$(src))
进度:$(OBJ)
$(CC)$(CFLAGS)$(LDFLAGS)$(LIBS)$(OBJ)-o程序
obj/%.o:src/%.cpp
$(CC)$(CFLAGS)-c$<-o$@
SRC=$(通配符SRC/***.cpp)
用于位于
SRC
SRC = $(wildcard src/*.cpp)
OBJ = $(patsubst src/%.cpp, obj/%.o, $(SRC))

prog: $(OBJ)
  $(CC) $(CFLAGS) $(LDFLAGS) $(LIBS) $(OBJ) -o prog 

obj/%.o: src/%.cpp
  $(CC) $(CFLAGS) -c $< -o $@