使用makefile构建.o文件,需要澄清

时间:2012-08-14 02:46:32

标签: makefile

我的makefile包含以下行

 11 SRC := $(shell echo src/*.cpp)
 12 SRC += $(shell echo $(TEST_ROOT)/*.cpp)
 13 
 14 OBJECTS = $(SRC:.cpp=.o)

 22 # [debug] target
 23 $(TARGET): $(OBJECTS)
 24   $(CC) $(OBJECTS) -o $(TARGET)
 25 
 26 # [debug] .o
 27 $(OBJECTS): $(SRC)
 28   $(CC) $(CFLAGS) $(DEBUG_FLAGS) -c $(SRC) $(OBJECTS)

哪个失败是因为......以下显然不是一种方法

g++ -pedantic -Wall -Werror -O0 -g -Wno-format -DUSE_MEASURE -c src/Timer.cpp test/TimerTest.cpp src/Timer.o test/TimerTest.o

我应该如何修改#28行以从我的所有来源生成.o?

1 个答案:

答案 0 :(得分:2)

这应该可以解决问题:

$(OBJECTS): %.o : %.cpp
    $(CC) $(CFLAGS) $(DEBUG_FLAGS) -c $< $@

此规则将构建一个目标文件,而Make将为另一个规则所需的每个对象调用一次。您可以编写一个将在一次通过中构建所有目标文件的规则,但这没有任何优势。

修改:

假设SRCsrc/foo.cpp src/bar.cpp testroot/baz.cpp
因此OBJECTSsrc/foo.o src/bar.o testroot/baz.o

我们可以为每个人制定一个单独的规则:

src/foo.o : src/foo.cpp
    ...

src/bar.o : src/bar.cpp
    ...

testroot/baz.o : testroot/baz.cpp
    ...

但这是多余的(因为命令非常相似)并且不方便(因为我们不想在添加/删除目标时添加/删除规则)。所以我们使用pattern rule

%.o : %.cpp
    ...

现在当Make想要构建src/foo.o时,它会看到目标与模式%.o匹配,词干(对应%)是src/foo,并且相应prereq,src/foo.cpp存在,因此它使用此规则。

但我们有一个变量OBJECTS,列出了我们想要使用此规则构建的目标,因此我们可以将其限制为static pattern rule,它看起来大致相同但具有一些我们不需要的优势进入这里:

$(OBJECTS) : %.o : %.cpp
    ...

现在是...部分。该命令告诉编译器扫描prereq(src/foo.cpp)并构建目标(src/foo.o),因此我们必须在命令中引用这些内容。 Automatic variables对此有所帮助; $@是目标的名称,$<是第一个(在这种情况下是唯一的)先决条件的名称:

$(OBJECTS): %.o : %.cpp
    $(CC) $(CFLAGS) $(DEBUG_FLAGS) -c $< $@