繁体   English   中英

执行make时没有这样的文件'main.o'错误

[英]No such file 'main.o' error when execute make

我在同一个目录中有以下文件。

.
├── Makefile
├── lexer.cpp
├── lexer.h
├── parser.cpp
├── parser.h
├── main.cpp

main.cpp取决于parser.hlexer.h

lexer.cpp依赖于lexer.h

parser.cpp取决于parser.h ,而parser.h又取决于lexer.h

我有一个 Makefile 来编译文件并按如下方式链接它们。

all: main

main: main.o lexer.o parser.o
    $(CXX) $(CFLAGS) -o $@ mccomp.o lexer.o parser.o

main.o: main.cpp lexer.h parser.h
    $(CXX) $(CFLAGS) -c lexer.h parser.h

lexer.o: lexer.cpp lexer.h
    $(CXX) $(CFLAGS) -c lexer.h

parser.o: parser.cpp parser.h lexer.h
    $(CXX) $(CFLAGS) -c parser.h lexer.h

clean:
    rm -rf main

当我执行make ,出现以下错误。

clang-11: error: no such file or directory: 'main.o'
clang-11: error: no such file or directory: 'lexer.o'
clang-11: error: no such file or directory: 'parser.o'

鉴于%.o规则应该生成这些文件,我不知道为什么会发生这种情况。 我该如何解决?

生成 .o 文件的规则实际上都没有提到他们应该编译的 cpp 文件。 将 .cpp 文件(或魔法变量$< )添加到配方而不是所有头文件:

main.o: main.cpp lexer.h parser.h
    $(CXX) $(CFLAGS) -c main.cpp -o $@

或者

main.o: main.cpp lexer.h parser.h
    $(CXX) $(CFLAGS) -c $< -o $@

另请注意,编译 .cpp 文件有一个内置规则,因此只需说明依赖项即可:

main.o: main.cpp lexer.h parser.h
lexer.o: lexer.cpp lexer.h
parser.o: parser.cpp parser.h lexer.h

如果输入文件之一发生更改,Make 将重新编译 .o 文件。 请注意,它使用CXXFLAGS而不是CFLAGS

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM