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

Linux makefile的问题非常奇怪,没有这样的文件或目录,linux,makefile,centos,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 f

我遇到了一个非常奇怪的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
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
令我惊讶的是,我可以通过这种方式成功构建

有人能解释一下为什么我在开始的最后一个文件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
以下是我添加虚拟线后的输出:

file1.o : file1.cpp
file2.o : file2.cpp
file3.o : file3.cpp
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”重命名为“makefile”,但这次无法使用。

Ufffff!!发现了你的问题

当你写信的时候

file1.o : file1.cpp
file2.o : file2.cpp
file3.o : file3.cpp
在您的
makefile
中,一位执事来了,并在
file3.o:file3.cpp
行后引入了一个选项卡,因此make而不是采用隐式规则,因为您指定的是显式规则。对于
file1.o
file2.o
它使用隐式规则,但对于
file3.o
它假定您正在指定显式规则,因为该选项卡,但您给了它一个空白选项卡,所以从未生成
file3.o

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


仅供参考:
Makefile
Makefile
之间没有区别,make对两者都一视同仁,除非
Makefile
Makefile
文件都在同一个文件夹中,并且您给出make,然后执行
Makefile
而不是
Makefile

,您能告诉我们运行
make
失败时的确切输出吗?@wallyk否,如果这就是问题所在,您会看到类似于
make:**没有规则将目标设置为'file3.o'。停止。
该错误意味着
g++
找不到
file3.o
,这听起来像是无法正确创建。无法重现您的问题是的,这就是原因。你很认真,非常感谢!