makefile非常奇怪,没有这样的文件或目录

时间:2015-07-22 22:11:16

标签: linux makefile centos

我遇到了一个非常奇怪的makefile问题,这里是: 系统:Linux CentOS 6 最初,makefile的名称是“makefile”,其示例内容为:

OPTFLAGS = -Wall -g -O
CXX = g++ 
INC = -I/usr/local/include -I/usr/include  
LIBS = -L/usr/local/lib -L/usr/lib64    
CXXFLAGS = $(OPTFLAGS) $(INC)

SOURCES = file1.cpp file2.cpp file3.cpp
OBJECTS = $(SOURCES:.cpp=.o)

EXECUTABLE = mybin

$(EXECUTABLE): $(OBJECTS) 
    $(CXX) $(CXXFLAGS) $(INC) $(LIBS) $(OBJECTS) -o $@

file1.o : file1.cpp
file2.o : file2.cpp
file3.o : file3.cpp

.PHONY: clean
clean:
    rm -f $(EXECUTABLE) *.o core*

我跑了“make”之后跟着错了:  g ++:file3.o:没有这样的文件或目录

我有一个解决方法是在file3之后​​添加一个虚拟文件:

dummy.o : dummy.cpp

这样我就可以成功构建。

我知道我可以删除所有这些行:

file1.o : file1.cpp
file2.o : file2.cpp
file3.o : file3.cpp

让make使用默认设置进行构建,我可以通过这种方式成功构建。

我还尝试将“makefile”重命名为“Makefile”,并且以下行没有虚线:

file1.o : file1.cpp
file2.o : file2.cpp
file3.o : file3.cpp

令我惊讶的是,我可以通过这种方式成功构建。

有人可以解释为什么我在开头的最后一个文件3中收到“没有这样的文件或目录”的错误吗?

以下是错误输出:

g++ -g -Wall -O -I/usr/local/include -I/usr/include     -c -o file1.o file1.cpp
g++ -g -Wall -O -I/usr/local/include -I/usr/include     -c -o file2.o file2.cpp
g++ -g -Wall -O -I/usr/local/include -I/usr/include   -I/usr/local/include -I/usr/include   -L/usr/local/lib -L/usr/lib64 -lsybdb    file1.o file2.o file3.o -o mybin
g++: file3.o: No such file or directory
make: *** [mybin] Error 1

以下是我添加虚拟线后的输出:

g++  -Wall -g -O -I/usr/local/include -I/usr/include     -c -o file1.o file1.cpp
g++  -Wall -g -O -I/usr/local/include -I/usr/include     -c -o file2.o file2.cpp
g++  -Wall -g -O -I/usr/local/include -I/usr/include     -c -o file3.o file3.cpp
g++  -Wall -g -O -I/usr/local/include -I/usr/include   -I/usr/local/include -I/usr/include   -L/usr/local/lib -L/usr/lib64 -lsybdb    file1.o file2.o file3.o -o mybin

我试图重命名" makefile" to" Makefile"再次,这次没有工作。

1 个答案:

答案 0 :(得分:1)

Ufffff !!找到了你的问题。

当你写

file1.o : file1.cpp
file2.o : file2.cpp
file3.o : file3.cpp

在你的makefile一个deamon来了,并在行file3.o : file3.cpp之后引入了一个TAB,所以不要采用隐式规则,而是认为你正在指定显式规则。对于file1.ofile2.o,它使用了隐式规则,但对于file3.o,它假定您正在指定显式规则,因为该TAB,但您已经给它一个空白的TAB,因此file3.o是从未建成。

现在,当您添加dummy.o:dummy.cpp时,TAB移到该行下方,因此编译了file3.o。在您进行实验时,您删除了TAB,这就是为什么将makefile重命名为Makefile似乎有效。

仅供参考:Makefilemakefile之间没有区别,两者都被make平等对待,除非Makefilemakefile文件都位于同一个文件夹中你给make,然后执行makefile而不是Makefile