C ++ makefile没有创建必要的.o文件

时间:2015-09-16 21:58:34

标签: c++ makefile

以下是我的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 ...

提前感谢您的帮助!

3 个答案:

答案 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 ,以便根据目标名称识别输出文件名:

$@

两个版本都会产生相同的效果。此外,请记住以相同方式更正剩余目标