Make执行时遗漏g++的-I编译标志问题求助
问题描述
编写了一个用于构建包含2个源文件和1个头文件的C++项目的Makefile,内容如下:
.PHONY: clean delete run CC = g++ CFLAGS = -g -Wall CXXFLAGS = $(CFLAGS) SRC = /home/hk_grub/dev/nCPrograms/Flagger/src/theclass.cpp /home/hk_grub/dev/nCPrograms/Flagger/src/main.cpp OBJ = $(SRC:.cpp=.o) INC = -I/home/user/dev/nCPrograms/Flagger/header EXECUTABLE = Flagger all: $(EXECUTABLE) $(EXECUTABLE): $(OBJ) $(CC) $(CFLAGS) $(INC) -o $@ $^ %%.o: %%.cpp $(CC) $(CFLAGS) $(INC) -c -o $@ $< clean: rm -rf $(OBJ) delete: rm -rf $(OBJ) $(EXECUTABLE) run: ./$(EXECUTABLE)
执行make命令时,输出的编译命令未携带指定的-I标志:
g++ -g -Wall -c -o /home/user/dev/nCPrograms/Flagger/src/theclass.o /home/user/dev/nCPrograms/Flagger/src/theclass.cpp
随后因头文件找不到编译失败,错误信息如下:
/home/user/dev/nCPrograms/Flagger/src/theclass.cpp:1:10: fatal error: theclass.h: No such file or directory 1 | #include <theclass.h> | ^~~~~~~~~~ compilation terminated. make: *** [<builtin>: /home/user/dev/nCPrograms/Flagger/src/theclass.o] Error 1
已通过@echo验证INC变量正常,也尝试调整参数位置、增减引号,但问题仍存在。手动编译和clangd均可正常识别该头文件路径及#include指令。
问题原因及解决办法
问题原因:Makefile中定义的目标文件编译规则错误使用了双百分号
%%,这不符合Make的普通模式规则语法。Make的常规模式规则需用单百分号%作为通配符,双百分号仅适用于跨目录构建等特殊场景。由于这个错误规则无法被Make识别,编译目标文件时会触发Make的内置默认规则,而默认规则中未包含你定义的INC变量,因此编译命令缺失-I参数。解决办法:将规则中的双百分号替换为单百分号,修改后的规则如下:
%.o: %.cpp $(CC) $(CFLAGS) $(INC) -c -o $@ $<
修改后重新执行make,Make会使用你自定义的规则编译目标文件,此时-I参数会被正确带入编译命令,头文件路径即可被识别。
另外注意:你的SRC变量中源文件路径是/home/hk_grub/...,但INC变量中的头文件路径是/home/user/...,如果这是笔误建议同步修正,避免后续出现其他路径问题。
内容的提问来源于stack exchange,提问作者hk_grub
相关产品推荐
相关产品推荐

