【发布时间】:2013-07-27 15:12:20
【问题描述】:
到目前为止,我有一个运行良好的 Makefile。虽然,随着它开始增长,每次重新编译所有源代码开始花费太长时间。这是工作版本的 sn-p:
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 变得过于臃肿。谢谢!
【问题讨论】:
-
我可能很笨,但
%.o: %.cpp和dotgazer/Dot.o: dotgazer/Dot.cpp规则不是加倍吗?比如,后者的目标不是已经被前者处理了吗? -
@AdamGoodwin 我认为它会以这种方式工作(只需要
%.o: %.cpp规则)。但事实证明 - 不。所以我添加了第二条规则,特别是对于第二个依赖项,它仍然不起作用。仅使用%.o: %.cpp规则,消息是相同的:can't create dotgazer/Dot.o: No such file or directory -
嗯,我刚刚尝试了您的 makefile,它对我来说效果很好。即使只使用
%.o目标而没有dotgazer/Dot.o目标,它也可以工作。你没有弄错文件名或目录吧?或者你是在做一些事情,比如从它自己的目录以外的地方运行 makefile? -
我很确定没有拼写错误或任何东西。我是从 Netbeans 运行它的,所以我认为它在 Makefile 的文件夹中运行
make。无论如何,接受的答案解决方案比我预期的要好得多。
标签: build makefile dependencies