如何使用Make链接.hpp文件?编译报错求助
解决Makefile中链接.hpp文件的编译错误
错误原因
你遇到的No rule to make target 'ruin.o'错误,核心问题是头文件(.hpp)不需要编译成目标文件(.o)。你的Makefile里错误地把ruin.hpp作为生成ruin.o的源文件,但目标文件只能由源代码文件(.cpp)编译生成,头文件是通过#include被.cpp文件引用的,本身不参与编译生成.o。
修正后的Makefile方案
根据你的项目情况分两种场景处理:
场景1:ruin.hpp有对应的实现文件ruin.cpp
如果ruin.hpp是某个模块的头文件,存在对应的ruin.cpp实现文件,修改后的Makefile如下:
CC = g++ INC = -I include LIBS = -L lib -lsfml-system -lsfml-window -lsfml-graphics -lsfml-audio OBJECTS = run.o ruin.o interm.o all: prog prog: $(OBJECTS) $(CC) $(OBJECTS) $(LIBS) -o prog run.o: run.cpp ruin.hpp $(CC) $(INC) -c run.cpp -o run.o ruin.o: ruin.cpp ruin.hpp $(CC) $(INC) -c ruin.cpp -o ruin.o interm.o: interm.cpp ruin.hpp $(CC) $(INC) -c interm.cpp -o interm.o clean: rm -f *.o prog
场景2:ruin.hpp是纯头文件(无对应.cpp)
如果ruin.hpp只是包含宏、模板或内联函数的纯头文件,没有对应的实现文件,那么不需要生成ruin.o,修改后的Makefile如下:
CC = g++ INC = -I include LIBS = -L lib -lsfml-system -lsfml-window -lsfml-graphics -lsfml-audio OBJECTS = run.o interm.o # 移除ruin.o all: prog prog: $(OBJECTS) $(CC) $(OBJECTS) $(LIBS) -o prog run.o: run.cpp ruin.hpp $(CC) $(INC) -c run.cpp -o run.o interm.o: interm.cpp ruin.hpp $(CC) $(INC) -c interm.cpp -o interm.o clean: rm -f *.o prog
关键修改说明
- 移除了原Makefile中错误的
ruin.o: ruin.hpp规则,替换为正确的.cpp到.o的编译规则(或直接移除ruin.o) - 给每个.cpp对应的.o目标添加了
ruin.hpp作为依赖,这样当头文件内容修改时,对应的源文件会自动重新编译 - 编译命令中加入
$(INC),确保编译器能找到include目录下的头文件 - 统一使用
$(CC)变量,保持Makefile的一致性 clean目标中添加了prog,并使用rm -f避免因文件不存在而报错
内容的提问来源于stack exchange,提问作者verdy
相关产品推荐
相关产品推荐

