C++编译所用Makefile无法正常运行,执行make calc提示已最新不编译
Makefile异常原因排查
所有问题的核心是编写的Makefile不符合Make的规则约定,具体问题点如下:
- calc目标规则存在逻辑错误
Make判断目标是否需要重新执行的核心逻辑是:检查目标对应的同名文件是否比其依赖文件更新。你写的calc目标没有绑定任何依赖(比如源文件calc.cpp),且编译命令用-o $(OBJS)输出的是calc.o,根本不会生成和目标同名的calc文件。只要当前目录下存在任意名为calc的文件(哪怕是空文件),就算没有该文件,Make也会因为没有检测到依赖变动,判定calc目标已经是最新状态,不会触发编译流程,这就是执行make calc提示make: 'calc' is up to date.的直接原因。 - all目标依赖顺序逻辑错误
你将clean设为all的依赖项,Make执行目标时会先跑完所有依赖的规则再执行目标本身的命令。由于calc目标被判定为无需更新,执行make all时就会直接运行clean的规则,所以只会输出rm -f calc.o就结束运行。 - all目标本身无绑定执行命令
当你移除all的clean依赖后,all仅依赖calc,而calc已经被判定为无需更新,all本身又没有绑定任何执行命令,所以会提示make: Nothing to be done for 'all'.。
修复后的参考Makefile
SRCS=calc.cpp # 最终生成的可执行文件名为calc,不使用.o后缀 TARGET=calc FLGS=-std=c++17 # 声明all、clean、run为伪目标,避免和目录下的同名文件冲突 .PHONY: all clean run all: $(TARGET) run clean # 给calc目标绑定源文件作为依赖,只要源文件改动就会触发重编译 $(TARGET): $(SRCS) g++ $^ $(FLGS) -o $@ run: $(TARGET) ./$(TARGET) clean: rm -f $(TARGET)
内容的提问来源于stack exchange,提问作者rjc810
相关产品推荐
相关产品推荐

