GNU make中的复杂模式替换

时间:2012-09-28 05:44:58

标签: linux makefile

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

没有规则要制作目标`/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变量似乎已正确填充,但我无法创建对象列表。根据文档,第二个想法应该有效,但事实并非如此。替换语句有什么问题。

要明确:我希望有例如。

c_files = src/file1.cc src/file2.cc src/file109.cc

我想从中创建以下列表

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

1 个答案:

答案 0 :(得分:1)

有一种更简单的方法:

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 $@