【问题标题】:Very strange issue of makefile, No such file or directory很奇怪的makefile问题,没有这样的文件或目录
【发布时间】:2015-07-24 15:18:36
【问题描述】:

我遇到了一个非常奇怪的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”重命名为“Makefile”,但这次不行。

【问题讨论】:

  • 你能告诉我们运行make失败时的exact输出吗?
  • @wallyk 不,如果这是问题所在,您会看到类似make: *** No rule to make target `file3.o'. Stop. 的错误信息意味着g++ 找不到file3.o,这听起来好像无法以某种方式正确创建。
  • 无法重现您的问题

标签: linux makefile centos


【解决方案1】:

嘘!!找到了你的问题。

你写的时候

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

在您的makefile 中,一个守护进程出现并在file3.o : file3.cpp 行之后引入了一个制表符,因此请不要采用隐式规则,而是认为您正在指定显式规则。对于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

【讨论】:

  • 是的,这就是原因。你太认真了,非常感谢!
猜你喜欢
  • 2016-01-10
  • 1970-01-01
  • 1970-01-01
  • 2012-10-30
  • 1970-01-01
  • 2016-02-11
  • 2014-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多