以下是我的makefile,用于将一些基本的C ++文件编译成可执行文件:
OBJ= node.o link.o trie.o testtrie.o
OPTS= -g -c -Wall -Werror
testtrie: $(OBJ)
g++ -o testtrie $(OBJ)
testtrie.o: prog3.cc trie.h trie.cc link.h link.cc node.h node.cc
g++ $(OPTS) prog3.cc
trie.o: trie.cc trie.h
g++ $(OPTS) trie.cc
link.o: link.cc link.h
g++ $(OPTS) link.cc
node.o: node.cc node.h
g++ $(OPTS) node.cc
clean:
rm -f *.o *~
然而,当我运行make
时,在尝试编译prog3.cc时,它说:
g ++:testtrie.o:没有这样的文件或目录。
我不能为我的生活弄清楚为什么它不会使testtrie.o ...
提前感谢您的帮助!
答案 0 :(得分:3)
您的testtrie.o
规则:
testtrie.o: prog3.cc trie.h trie.cc link.h link.cc node.h node.cc
g++ $(OPTS) prog3.cc
实际上并不构建testtrie.o
,而是构建prog3.o
。
(它还有一些它实际上没有使用的必备源文件,除非你正在做一些不健康的事情,例如#include
。)
答案 1 :(得分:1)
这是因为您的可执行文件( testtrie )依赖于 testtrie.o 。
默认情况下,编译源文件(例如 src.cc )时编译器(在我们的例子中是g ++),如果 -o 没有给出输出对象文件将匹配源文件名,因此它将是 src.o 。您的 testtrie.o 目标永远不会生成;而 prog3.o 是:
testtrie.o: prog3.cc trie.h trie.cc link.h link.cc node.h node.cc
g++ $(OPTS) prog3.cc
将命令修改为:
g++ $(OPTS) -o $@ prog3.cc
答案 2 :(得分:1)
目标class DownloadJobResults(VirtualDownloadView):
def get_file(self):
print "Job is {}".format(self.kwargs.get("job",None))
file = StringIO.StringIO()
file.write("test 1,2,3,4\n")
file.write("test 5,6,7,8\n")
file.seek(0)
return VirtualFile(file, name='sweet.txt')
的规则应该构建一个testtrie.o
文件,如下所示:
testtrie.o
您还可以添加automatic variable testtrie.o: prog3.cc trie.h trie.cc link.h link.cc node.h node.cc
g++ $(OPTS) prog3.cc -o testtrie.o
,以便根据目标名称识别输出文件名:
$@
两个版本都会产生相同的效果。此外,请记住以相同方式更正剩余目标。