Makefile中编译规则置于链接规则前无法生成可执行文件问题咨询
核心原因:你遗漏了Makefile的默认目标执行规则
- 当你直接运行不带任何目标参数的
make命令时,make只会自动构建Makefile中定义的第一个规则的目标,后续规则默认不会被触发,除非被第一个目标的依赖链关联。 - 你提到的「规则排列顺序不影响执行结果」的说法有前提:只有当你显式指定了要构建的目标(比如第一种写法下运行
make run)时,规则顺序才不会影响最终结果。
对应场景解释:
- 第一种写法中第一个目标是
main.o,运行无参数make时,只会执行main.o对应的编译规则,生成目标文件后就停止,不会处理后续的run规则,因此无法生成可执行文件。 - 第二种写法中第一个目标是
run,run依赖main.o,make会先自动构建依赖的main.o,再执行run对应的链接规则,因此能正常生成可执行文件。
最佳实践建议:
你可以在Makefile最开头定义伪目标.PHONY: all,将需要默认构建的目标放在all的依赖中,这样就不受后续规则排序的影响,示例如下:
# 声明伪目标,避免和同名文件冲突 .PHONY: all clean # 默认构建目标指定为run all: run main.o: main.f95 gfortran -c main.f95 run: main.o gfortran -o run main.o # 清理规则 clean: rm -f *.o run
内容的提问来源于stack exchange,提问作者Peaceful
相关产品推荐
相关产品推荐

