请教: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,这个错误会导致编译选项无法被正确加载。
修复步骤
- 修正编译选项变量名:把
CGLAGS改为CFLAGS,确保编译参数能被正确识别。 - 正确匹配头文件依赖:有两种方式处理头文件依赖:
- 方式一:显式列出所有头文件
如果项目头文件数量不多,直接把需要的头文件逐个列出来,比如:a.out: main.cpp window.hpp renderer.hpp - 方式二:使用
wildcard函数自动匹配
利用Make的wildcard函数自动扫描当前目录下的所有.cpp和.hpp文件,修改依赖行:a.out: $(wildcard *.cpp) $(wildcard *.hpp)
- 方式一:显式列出所有头文件
- 优化测试目标的执行路径:
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
相关产品推荐
相关产品推荐

