到目前为止,我有一个运行良好的 Makefile。虽然,随着它开始增长,每次重新编译所有源代码开始花费太长时间。这是工作版本的一个片段:
CC=$(CROSS_COMPILE)g++
CFLAGS=-Wall -I./include -pg -O2
VPATH=./src:./include
all: dotgazer.cpp dotgazer/Dot.cpp
$(CC) $(CFLAGS) $^ -o dotgazer.out `pkg-config --libs opencv`
还有更多的依赖关系,但这两个足以说明问题所在。我正在尝试将每个cpp
文件的编译阶段移至单独的目标。当涉及到顶级文件 ( dotgazer.cpp
) 时,这不是问题,一般规则%.o: %.cpp
可以正常工作。但我无法让第二个依赖项工作。这是它现在的样子:
CC=$(CROSS_COMPILE)g++
CFLAGS=-Wall -I./include -pg -O2
VPATH=./src:./include
all: dotgazer.o dotgazer/Dot.o
$(CC) $(CFLAGS) $^ -o dotgazer.out `pkg-config --libs opencv`
%.o: %.cpp
$(CC) -c $(CFLAGS) $^ -o $@
dotgazer/Dot.o: dotgazer/Dot.cpp
$(CC) -c $(CFLAGS) $^ -o $@
我已经尝试过不同的Dot.o
规则变体,但它们似乎都不起作用。我得到的错误是:
Fatal error: can't create dotgazer/Dot.o: No such file or directory
我该怎么做?我最喜欢将.o
文件放在与它们的源相同的文件夹中。另外,我会感谢一般规则(如%.o: %.cpp
),因为有很多源文件,我不希望 Makefile 变得过于臃肿。谢谢!