linux - 非常奇怪的 makefile 问题,没有那个文件或目录

标签 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”重命名为“Makefile”,但这次不行。

最佳答案

呜呜呜!!找到您的问题。

当你写的时候

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

在您的 makefile 中,守护进程出现并在 file3.o : file3.cpp 行之后引入了一个 TAB,因此 make 认为您正在指定显式规则而不是采用隐式规则.对于 file1.ofile2.o 它使用了隐式规则,但是对于 file3.o 它假设你因为那个 TAB 而指定了显式规则,但是你给了它一个空白的 TAB,所以 file3.o 从未被构建。

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

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

关于linux - 非常奇怪的 makefile 问题,没有那个文件或目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31574918/

相关文章:

linux - 使用双因素身份验证在 Linux 上尝试 "Sign in to Google"时 Eclipse 崩溃

for-loop - Makefile:for 循环并在出错时中断

linux - noarch rpm 和 rpm 之间的区别

centos - centos 7安装gitlab后报错422

linux - cassandra 已死,但 pid 文件存在于亚马逊 centos 6 上

c++ - 当服务器将数据作为 c 结构发送时,我们可以在客户端将缓冲区类型转换为 C++ 结构吗?

linux - 确定跨 Linux 平台加载哪个共享库的可靠方法是什么?

linux - 从模块调用函数

linux - Arduino SD 库 arduino-core 1 :1. 0.0.1+dfsg-7 未定义引用

firefox - 构建 GNU make 的 Cygwin 版本