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

C++ makefile not creating a necessary .o file

本文关键字:文件 创建 makefile c++      更新时间:2023-10-16

下面是我将一些基本的c++文件编译成可执行文件的makefile:

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。0:没有这样的文件或目录。

我无论如何也弄不明白为什么它不能使测试成功。

提前感谢您的帮助!

您的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。)

这是因为您的可执行文件(testtrie)依赖于testtrie.o

默认情况下,编译器(在我们的例子中是g++),在编译源文件(例如src.cc)时,如果没有给定-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

目标testtrie.o的规则应该构建一个testtrie.o文件,如下所示:

testtrie.o: prog3.cc trie.h trie.cc link.h link.cc node.h node.cc
    g++ $(OPTS) prog3.cc -o testtrie.o

您还可以添加一个自动变量$@,使其识别基于目标名称的输出文件名:

testtrie.o: prog3.cc trie.h trie.cc link.h link.cc node.h node.cc
    g++ $(OPTS) prog3.cc -o $@

两个版本的效果是一样的。另外,要记住以同样的方式纠正剩余的目标