首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >执行make时没有这样的文件'main.o‘错误

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

Stack Overflow用户
提问于 2021-11-08 19:12:27
回答 1查看 197关注 0票数 0

下面的文件都在同一个目录中。

代码语言:javascript
复制
.
├── Makefile
├── lexer.cpp
├── lexer.h
├── parser.cpp
├── parser.h
├── main.cpp

main.cpp依赖于parser.hlexer.h

lexer.cpp依赖于lexer.h

parser.cpp依赖于parser.h,而后者又依赖于lexer.h

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

代码语言:javascript
复制
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时,我会得到以下错误。

代码语言:javascript
复制
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规则应该生成这些文件。我该怎么解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-08 19:16:51

生成.o文件的规则实际上没有提到它们应该编译的cpp文件。将.cpp文件(或神奇变量$<)添加到菜谱中,而不是添加所有头文件:

代码语言:javascript
复制
main.o: main.cpp lexer.h parser.h
    $(CXX) $(CFLAGS) -c main.cpp -o $@

代码语言:javascript
复制
main.o: main.cpp lexer.h parser.h
    $(CXX) $(CFLAGS) -c $< -o $@

还请注意,编译.cpp文件有一个内置规则,因此它足以声明依赖关系:

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69888746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档