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