执行 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.h
和 lexer.h
.
lexer.cpp
取决于 lexer.h
parser.cpp
取决于 parser.h
而后者又取决于 lexer.h
.
我有一个 Makefile 来编译这些文件,link它们如下。
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
规则应该生成这些文件,我不知道为什么会这样。我该如何解决这个问题?
None 生成 .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
。
我在同一目录中有以下文件。
.
├── Makefile
├── lexer.cpp
├── lexer.h
├── parser.cpp
├── parser.h
├── main.cpp
main.cpp
取决于 parser.h
和 lexer.h
.
lexer.cpp
取决于 lexer.h
parser.cpp
取决于 parser.h
而后者又取决于 lexer.h
.
我有一个 Makefile 来编译这些文件,link它们如下。
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
规则应该生成这些文件,我不知道为什么会这样。我该如何解决这个问题?
None 生成 .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
。