You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 09:30:59