Linux下Makefile执行异常:提示'mkFile'已更新却未生成目标文件
解决Makefile执行
make时提示“mkFile is up to date”却不生成文件的问题 看起来你踩了Makefile里一个常见的小坑,我来帮你拆解一下问题所在:
核心原因分析
当你运行make时,它会默认把Makefile里第一个出现的目标当作最终要构建的对象。如果你的mkFile里第一个目标写的是mkFile本身(比如类似mkFile: ...这样的规则),那make就会认为你要维护的是这个Makefile文件本身——而它已经存在,自然就会输出“'mkFile' is up to date”,完全不会去处理你的C代码。
另外补充一点:make默认只会找名为Makefile或makefile的配置文件,你用了mkFile这个名字,正常情况下直接跑make应该会提示找不到makefile才对。能出现这个提示,说明你要么是用了make mkFile的命令,要么就是你的Makefile里真的把自身设成了第一个目标。
正确的Makefile写法示例
假设你最终要生成的可执行文件叫myconverter,你可以把mkFile改成下面这样:
# 定义编译器和编译参数(可选,但推荐) CC = gcc CFLAGS = -Wall -g # -Wall开启警告,-g生成调试信息 # 最终可执行文件目标:依赖所有需要的.o文件 myconverter: Main.o convertAll.o convertSentence.o $(CC) $(CFLAGS) -o $@ $^ # $@代表目标文件名,$^代表所有依赖文件 # 每个.c文件对应的.o文件规则(依赖头文件) Main.o: Main.c convertAll.h convertAll.o: convertAll.c convertAll.h convertSentence.h convertSentence.o: convertSentence.c convertSentence.h # 清理生成文件的规则(可选,方便重新编译) clean: rm -f myconverter *.o
执行步骤
- 修改好
mkFile之后,运行命令时要指定这个自定义的Makefile文件名:
或者你直接把make -f mkFilemkFile重命名为Makefile,这样直接跑make就行,更省心。 - 如果需要清理生成的.o和可执行文件,就跑:
make -f mkFile clean
额外提示
- 确保所有头文件的依赖都写对了:比如你提到
convertAll.c包含convertAll.h,如果它还用到了convertSentence.h里的内容,一定要把convertSentence.h加到convertAll.o的依赖里,否则make可能不会在头文件修改后重新编译对应的.c文件。 - 上面的示例用了
$@和$^这些自动变量,能简化Makefile的写法,避免重复写文件名,你可以慢慢熟悉它们的用法。
内容的提问来源于stack exchange,提问作者Some_Dude
相关产品推荐
相关产品推荐

