makefile找不到.o文件

时间:2015-05-11 18:49:51

标签: c++ makefile

我正在使用隐式规则处理一个简单的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

问题是什么?

1 个答案:

答案 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也没有帮助。