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

Makefile同名模式规则疑问:$(OBJDIR)/%.o为何能区分C/C++编译

Make如何选择同名目标的模式规则?

你在项目中定义了两条目标同为$(OBJDIR)/%.o的模式规则,实际运行时Make能正确为.c和.cpp文件匹配对应规则,其决策逻辑如下:

首先看你定义的Makefile代码:

# C Files
$(OBJDIR)/%.o: %.c
    +$(CC) $(CFLAGS) $(INCLUDES) -D__FILENAME__='"$(<F)"' $(CWARNS) -c $< -o $@

# C++ Files
$(OBJDIR)/%.o: %.cpp
    +$(CPP) $(CPPFLAGS) $(INCLUDES) -D__FILENAME__='"$(<F)"' $(CPPWARNS) -c $< -o $@

核心决策逻辑

  • 先验证依赖文件的存在性
    当Make需要生成某个目标文件(比如obj/bar.o)时,会先将两条规则中的%替换为匹配的字符串(这里是bar),得到对应的依赖文件bar.c和bar.cpp,然后检查这两个文件是否存在:
    • 若仅bar.c存在,直接选用第一条规则;
    • 若仅bar.cpp存在,直接选用第二条规则;
  • 多依赖存在时,按后缀优先级选择
    如果bar.c和bar.cpp同时存在,Make会依据内置的后缀优先级来判断:C++相关的后缀(.cpp、.cc等)优先级高于C语言的.c后缀,因此会优先选择第二条规则;
  • 模式规则的匹配优先级补充
    除了后缀优先级,Make还会优先选择更具体的规则,但这里两条规则的模式完全一致,所以最终由依赖的存在性和后缀优先级决定。

内容的提问来源于stack exchange,提问作者pebu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 18:07:08