我的Makefile存在什么问题?编译提示目标文件不存在错误
解决Makefile编译时找不到.o文件的问题
嘿,我刚看完你的问题,这不就是新手写Makefile最容易踩的坑嘛!你执行make时遇到的找不到.o文件的错误,本质是你的Makefile没告诉make工具怎么生成那些依赖的目标文件。
先把你的错误信息再明确下:
执行
make命令时出现如下错误:gcc: error: main.o: no such file or directory gcc: error: commands.o: No such file or directory Makefile:13 recipe for target program failed make: ***[program] Error 1
你的Makefile目前只定义了编译器和编译选项,但缺少关键的目标依赖规则——也就是告诉make:要生成最终的program,需要先把main.c和commands.c编译成.o文件,以及具体怎么编译。
给你两种修复方案,你可以按需选择:
方案一:明确写出所有编译规则(推荐,清晰易懂)
补全后的Makefile大概是这样的,你可以把自己的CFLAGS剩余选项补进去:
CC = gcc CFLAGS = -g -std=c11 -Wall -Wextra -Wpedantic -Werror \ -Wfloat-equal -Wlogical-op -Wshadow -Wswitch-default \ -Wbad-function-cast -Wcast-qual -Waggregate-return \ -fno... # 这里补全你没写完的编译选项 # 最终目标:生成program,依赖main.o和commands.o program: main.o commands.o $(CC) $(CFLAGS) -o $@ $^ # 从main.c编译生成main.o main.o: main.c $(CC) $(CFLAGS) -c -o $@ $< # 从commands.c编译生成commands.o commands.o: commands.c $(CC) $(CFLAGS) -c -o $@ $< # 可选:添加clean规则,方便清理生成的文件 clean: rm -f program *.o
规则解释:
program: main.o commands.o:告诉make,要得到program,必须先有main.o和commands.o这两个文件- 每个
.o的规则:用-c参数让gcc只编译不链接,生成对应的目标文件 $@、$^、$<是make的自动变量:$@= 当前目标文件名(比如program或main.o)$^= 当前目标的所有依赖文件(比如main.o commands.o)$<= 当前目标的第一个依赖文件(比如main.c)
方案二:利用make的隐含规则(更简洁)
make有内置的隐含规则,会自动把xxx.c编译成xxx.o,所以如果你不想写每个.o的规则,只要保证对应的.c文件在当前目录,只需要写最终目标的规则就行:
CC = gcc CFLAGS = -g -std=c11 -Wall -Wextra -Wpedantic -Werror \ -Wfloat-equal -Wlogical-op -Wshadow -Wswitch-default \ -Wbad-function-cast -Wcast-qual -Waggregate-return \ -fno... program: main.o commands.o $(CC) $(CFLAGS) -o $@ $^ clean: rm -f program *.o
最后要注意的两个细节:
- 确保
main.c和commands.c确实在你执行make的当前目录下,别放错文件夹了! - Makefile里的命令行(比如
$(CC) ...那一行)必须用Tab键开头,绝对不能用空格代替,这是make的硬性要求,很多新手栽在这上面!
内容的提问来源于stack exchange,提问作者Tony Do
相关产品推荐
相关产品推荐

