1

我的 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?

4

1 回答 1

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
    ...

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

%.o : %.cpp
    ...

现在Make要构建src/foo.o的时候,看到target匹配pattern %.o,stem(对应%)是src/foo,对应的prereqsrc/foo.cpp存在,所以使用这个规则。

但是我们有一个变量OBJECTS,它列出了我们想用这个规则构建的目标,所以我们可以将它限制为一个静态模式规则,它看起来差不多,但有一些我们不需要在这里讨论的优点:

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

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

$(OBJECTS): %.o : %.cpp
    $(CC) $(CFLAGS) $(DEBUG_FLAGS) -c $< $@
于 2012-08-14T04:04:09.627 回答