编写编译运行C程序的Makefile异常:仅运行可执行文件未编译源码
嘿,我来帮你搞定这个Makefile的问题~
你原来的Makefile写法完全搞错了规则结构,这就是为什么它只运行不编译的原因。先看你原来的代码:
all: test.c gcc test.c ./testexec
Makefile的语法是目标: 依赖列表,然后下一行必须用tab键缩进写要执行的命令。你把编译和运行命令直接塞到依赖列表里了,Make会把gcc、./testexec这些当成all目标需要依赖的文件,而不是要执行的命令。如果testexec已经存在,Make就觉得所有依赖都满足了,自然不会去编译。
给你写个正确的版本:
# 默认目标:先确保testexec存在,再运行它 all: testexec ./testexec # 编译规则:当test.c更新或testexec不存在时,重新编译 testexec: test.c gcc test.c -o testexec # 可选:清理生成的可执行文件,方便重新编译 clean: rm -f testexec
解释下每个部分:
all: testexec:把all设为默认目标,它依赖于testexec,所以Make会先确保testexec是最新的,才会执行all的命令。./testexec:这是all目标要执行的命令,必须用tab缩进(别用空格,Make对这个很严格)。testexec: test.c:定义testexec的依赖是test.c,只要test.c的修改时间比testexec新,或者testexec压根不存在,Make就会执行下面的编译命令。gcc test.c -o testexec:指定输出文件名为testexec,不然gcc默认生成的是a.out,和你要的文件名对应不上。
现在运行make,它会先检查testexec是否需要更新,需要的话先编译,然后自动运行;如果test.c没改,就直接运行testexec,完全符合你的需求~
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

