我的文件夹结构如下
/Myapp/main.c
/Myapp/f1.c
/Myapp/f1.h
/Myapp/Makefile
我的 Makefile 竞赛是
CC = gcc
main: main.o f1.o
$(CC) -o main main.o f1.o
main.o: main.c f1.h
f1.o: f1.c f1.h
我在目录 Myapp 中运行 makefile,它工作正常
但是......当我将 f1.h 移动到这样的包含文件夹时:
/Myapp/main.c
/Myapp/f1.c
/Myapp/Makefile
/Myapp/include/f1.h
并在Makefile中添加包含路径
CC = gcc
INCLUDE = ./include/
main: main.o f1.o
$(CC) -I$(INCLUDE) -o main main.o f1.o
main.o: main.c f1.h
f1.o: f1.c f1.h
它将显示: make: *** 没有规则可以生成“main.o”所需的目标“f1.h”。停止。
这让我困惑了一段时间。
搜索相关问题后仍然无法解决这个简单的问题
(我猜这可能是一个相对目录问题,对吧?)
感谢您的帮助。
改变
到
您需要更改 f1.h 相关路径,为其添加“include”
避免
-I
参数列表的一个简单方法是使所有#include
指令指定相对于 Makefile 目录的文件。例如在 main.c 和 f1.c 中你写并在你的 Makefile 中
Makerules 递归地工作。当解析main时, make 首先按照给定的顺序解析它的所有依赖项。所以它确实:
所以问题不在于规则main不知道 f1.h 在哪里,而是main.o 如果你想保留规则,最简单的方法就是将规则 main.o 更改为
main.o: main.c $(INCLUDE)f1.h