Windows下GNU Make伪目标未生效,每次运行均重新编译求助
Windows下GNU Make重复编译问题的解决
你的问题和伪目标本身无关,.PHONY: all仅用于标记all为伪目标(不会生成名为all的实体文件),真正的问题出在Windows下可执行文件的后缀匹配逻辑上。
在默认Make规则中,Unix系统的可执行文件无后缀,因此写testing: testing.cpp时,Make会默认生成名为testing的可执行文件;但Windows环境下g++编译输出的是testing.exe,Make找不到名为testing的目标文件,就会每次判定目标未完成,从而重复执行编译命令。
解决方法:明确指定.exe后缀的目标文件
修改Makefile,让目标名与实际生成的可执行文件名一致,这样Make就能正确对比源文件和目标文件的时间戳:
CXX = g++ CXXFLAGS = -Wall .PHONY: all clean all: testing.exe testing2.exe testing.exe: testing.cpp $(CXX) $(CXXFLAGS) -o $@ $< testing2.exe: testing2.cpp $(CXX) $(CXXFLAGS) -o $@ $< clean: del *.exe *.o
更简洁的写法:使用模式规则
如果有多个同类编译目标,可通过模式规则批量处理,避免重复代码:
CXX = g++ CXXFLAGS = -Wall .PHONY: all clean all: testing.exe testing2.exe %.exe: %.cpp $(CXX) $(CXXFLAGS) -o $@ $< clean: del *.exe *.o
修改后,Make会检查testing.exe、testing2.exe与对应.cpp文件的修改时间,仅当源文件更新时才会重新编译。
内容的提问来源于stack exchange,提问作者Diego Garcia
相关产品推荐
相关产品推荐

