Linux GNU-make中的复杂模式替换

Linux GNU-make中的复杂模式替换,linux,makefile,Linux,Makefile,我有以下想法: 所有源文件都在SRC目录中,而所有目标文件都保存在OBJ目录中。在GNU makefile中,我希望自动搜索所有源文件,并创建源文件对象列表和o-file对象列表。我尝试了以下两种语法,我都得到了一个 没有规则使目标“/home/Serial/obj/Serial.o”成为 以下是一些想法: c_files = $(wildcard $(SRC)/*.cpp) o_files = $(patsub %.c,%.o,$(c_files) ) c_files = $(wildca

我有以下想法: 所有源文件都在
SRC
目录中,而所有目标文件都保存在
OBJ
目录中。在GNU makefile中,我希望自动搜索所有源文件,并创建源文件对象列表和o-file对象列表。我尝试了以下两种语法,我都得到了一个

没有规则使目标“/home/Serial/obj/Serial.o”成为

以下是一些想法:

c_files = $(wildcard $(SRC)/*.cpp)
o_files = $(patsub %.c,%.o,$(c_files) )


c_files = $(wildcard $(SRC)/*.cpp)
o_files = $(patsub $(SRC)/%.c,$(OBJ)/%.o,$(c_files) )
c_files
变量似乎已正确填充,但我无法创建对象列表。根据文献记载,第二个想法应该是可行的,但事实并非如此。replace语句有什么问题

要明确的是:我希望有

c_files = src/file1.cc src/file2.cc src/file109.cc
我想从中创建以下列表

o_files = obj/file1.o obj/files.o obj/file109.o

有一个更简单的方法:

o_files = $(c_files:.cpp=.o)
要获得自动编译对象文件的模式,请执行以下操作:

obj/%.o: src/%.cpp
    $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $^ -o $@
合并:

c_files = $(wildcard $(SRC)/*.cpp)
o_files = $(c_files:.cpp=.o)

all: $(PROG)

$(OBJ)/%.o: $(SRC)/%.cpp
    $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $^ -o $@

$(PROG): $(o_files)
    $(LD) $(LDFLAGS) $^ -o $@

有一个更简单的方法:

o_files = $(c_files:.cpp=.o)
要获得自动编译对象文件的模式,请执行以下操作:

obj/%.o: src/%.cpp
    $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $^ -o $@
合并:

c_files = $(wildcard $(SRC)/*.cpp)
o_files = $(c_files:.cpp=.o)

all: $(PROG)

$(OBJ)/%.o: $(SRC)/%.cpp
    $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $^ -o $@

$(PROG): $(o_files)
    $(LD) $(LDFLAGS) $^ -o $@

也许更容易,但错了。给出相同的错误,没有编译o文件的规则。顺便说一句,o-file定义:$(o_文件):/n blahit没有!据我所知,%表示法是寻找模式,但没有文件?启动make时,
obj
为空!你这是什么意思?不管怎样,我发布的解决方案对我来说很有效!现在它似乎起作用了。那些文件真是太可怕了!但非常感谢。也许更简单,但错了。给出相同的错误,没有编译o文件的规则。顺便说一句,o-file定义:$(o_文件):/n blahit没有!据我所知,%表示法是寻找模式,但没有文件?启动make时,
obj
为空!你这是什么意思?不管怎样,我发布的解决方案对我来说很有效!现在它似乎起作用了。那些文件真是太可怕了!但是非常感谢。