GNU make 3.82未执行自定义命令问题求助
问题原因分析
你的问题核心是模式规则的语法错误,以及GNU make 3.81和3.82在规则匹配优先级上的差异:
错误的模式规则写法
你写的模式规则:%o : %c $(CC) -c $(CPFLAGS) -I. $(INCDIR) $< -o $@缺少了关键的小数点,正确的模式规则应该是:
%.o : %.c $(CC) -c $(CPFLAGS) -I. $(INCDIR) $< -o $@不带小数点的
%o和%c,会被make解析为“匹配任意字符串+o”和“匹配任意字符串+c”的模式,而非标准的.o和.c后缀文件匹配。版本间的规则优先级差异
- GNU make 3.81对这种非标准模式规则的兼容性更强,它会尝试将
%o匹配到.o结尾的目标文件(比如main.o会被拆解为%匹配main.,依赖对应main.c),并且此时用户自定义的规则优先级高于内置的%.o:%.c规则,所以会执行你的自定义编译命令。 - GNU make 3.82对模式匹配的逻辑做了更严格的优先级判断:内置的标准
%.o:%.c规则,因为精准匹配.o/.c后缀,优先级高于你写的非标准%o:%c规则。因此make会优先选择内置规则,执行默认的编译指令(也就是你看到的类似gcc -c -o main.o main.c的命令)。
- GNU make 3.81对这种非标准模式规则的兼容性更强,它会尝试将
后缀规则生效的原因
你改用的后缀规则.c.o:是GNU make支持的标准写法,它会被自动转换为等价的%.o:%.c模式规则,并且用户自定义的后缀规则会直接覆盖内置的同名规则,因此在两个版本的make中都能正确执行你的自定义命令。
内容的提问来源于stack exchange,提问作者honoyang
相关产品推荐
相关产品推荐

