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

请教:Makefile报错‘No rule to make target `*.hpp’如何解决?

问题:Makefile执行报错“No rule to make target `*.hpp'”

编写的Makefile代码如下:

CGLAGS= -std=c++17 -I. -I$(VULKAN_SDK_PATH)/include
LDFLAGS = -L$(VULKAN_SDK_PATH)/lib `pkg-config --static --libs glfw3` -lvulkan
OUTPUT_DIR = ./bin

a.out: *.cpp *.hpp
    g++ $(CFLAGS) -o $(OUTPUT_DIR)/a.out *.cpp $(LDFLAGS)

.PHONY: test clean

test: a.out
    ./a.out
clean:
    rm -f $(OUTPUT_DIR)/a.out

执行make命令时出现如下错误:

make: *** No rule to make target `*.hpp', needed by `a.out'.  Stop.

解决方法

错误原因

Make默认不支持在依赖列表中直接使用*.hpp这类通配符,它会将*.hpp当作一个具体的文件名,而当前目录中不存在这个文件,因此报错。另外你的Makefile里存在笔误:CGLAGS应为CFLAGS,这个错误会导致编译选项无法被正确加载。

修复步骤

  1. 修正编译选项变量名:把CGLAGS改为CFLAGS,确保编译参数能被正确识别。
  2. 正确匹配头文件依赖:有两种方式处理头文件依赖:
    • 方式一:显式列出所有头文件
      如果项目头文件数量不多,直接把需要的头文件逐个列出来,比如:
      a.out: main.cpp window.hpp renderer.hpp
      
    • 方式二:使用wildcard函数自动匹配
      利用Make的wildcard函数自动扫描当前目录下的所有.cpp和.hpp文件,修改依赖行:
      a.out: $(wildcard *.cpp) $(wildcard *.hpp)
      
  3. 优化测试目标的执行路径:test目标中执行程序时,最好指定输出目录下的可执行文件,避免当前目录有同名文件干扰:
    test: a.out
        ./$(OUTPUT_DIR)/a.out
    

修正后的完整Makefile

CFLAGS= -std=c++17 -I. -I$(VULKAN_SDK_PATH)/include
LDFLAGS = -L$(VULKAN_SDK_PATH)/lib `pkg-config --static --libs glfw3` -lvulkan
OUTPUT_DIR = ./bin

a.out: $(wildcard *.cpp) $(wildcard *.hpp)
    g++ $(CFLAGS) -o $(OUTPUT_DIR)/a.out *.cpp $(LDFLAGS)

.PHONY: test clean

test: a.out
    ./$(OUTPUT_DIR)/a.out
clean:
    rm -f $(OUTPUT_DIR)/a.out

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 18:02:11