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

Posted

技术标签:

【中文标题】C++ makefile 没有创建必要的 .o 文件【英文标题】:C++ makefile not creating a necessary .o file 【发布时间】:2015-09-16 21:58:33 【问题描述】:

以下是我将一些基本的 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.o: 没有这样的文件或目录。

我终其一生都无法弄清楚为什么它不能成为 testtrie.o...

提前感谢您的帮助!

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

那是因为您的可执行文件 (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

【讨论】:

【参考方案3】:

目标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

您还可以添加automatic variable $@ 使其根据目标名称识别输出文件名:

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

两个版本的效果相同。另外,记得用同样的方法修正剩余的目标

【讨论】:

以上是关于C++ makefile 没有创建必要的 .o 文件的主要内容,如果未能解决你的问题,请参考以下文章

用于 c++ 的 Makefile,带有一个 .o 文件和一个 .CPP 文件

如何在 makefile 指令中同时包含 C 和 C++ 文件

从 Visual Studio 2008 解决方案创建 Unix makefile

Makefile vpath %.o 找不到 obj 文件

如何将 C makefile 移植到 C++ makefile?

使用 WiringPi 的简单 Makefile