我正在使用隐式规则处理一个简单的makefile,而不是真正理解make如何决定它的执行顺序。当我有这样的makefile设置时,它说它找不到Wave.o:
CXX = g++
AudioSample: Wave.o AudioSample.o
$(CXX) -o AudioSample AudioSample.o Wave.o
AudioSample.o: Wave.h PCADPCM.h
$(CXX) -c AudioSample.cpp
Wave.o: Wave.h
终端输出:
g++ -o AudioSample AudioSample.o Wave.o
g++: error: Wave.o: No such file or directory
make: *** [AudioSample] Error 1
但是,当我更改目标的顺序时,它可以正常工作:
AudioSample: Wave.o AudioSample.o
$(CXX) -o AudioSample AudioSample.o Wave.o
Wave.o: Wave.h
AudioSample.o: Wave.h PCADPCM.h
$(CXX) -c AudioSample.cpp
终端输出:
g++ -c -o Wave.o Wave.cpp
g++ -c AudioSample.cpp
g++ -o AudioSample AudioSample.o Wave.o
问题是什么?
答案 0 :(得分:0)
仔细检查Makefile
中的标签与空格。
例如,使用Vim编辑器,您可以搜索标签/\t
或将以下内容添加到您的配置中:
" in ~/.vimrc
listchars=tab:»»,trail:·,nbsp:~
set list
您在Wave.o
规则中明显有一个隐藏标签(在我的编辑器中显示):
Wave.o : Wave.h
»»»»»»
此标签会破坏隐式规则以生成Wave.o
。删除额外的标签,它会像第二个Makefile
一样好,因为目标是文件的最后一行,因此没有Tab空间。
有关信息,Wave.h
是先决条件,make
不会使用它来猜测源文件名(在本例中为Wave.cpp
)。即使Wave.o : Wave.cpp
也没有帮助。