我的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?
答案 0 :(得分:2)
这应该可以解决问题:
$(OBJECTS): %.o : %.cpp
$(CC) $(CFLAGS) $(DEBUG_FLAGS) -c $< $@
此规则将构建一个目标文件,而Make将为另一个规则所需的每个对象调用一次。您可以编写一个将在一次通过中构建所有目标文件的规则,但这没有任何优势。
修改:
假设SRC
为src/foo.cpp src/bar.cpp testroot/baz.cpp
,
因此OBJECTS
为src/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 $< $@