我正在尝试编写一个 Makefile,当我在应用程序中添加一些 deps 时,我只需要更改 DEPS_NAME 变量,但是出现了问题,我不知道是什么。我知道这不是这个Makefile的唯一问题,我刚刚开始研究这项技术。
这是我的项目结构
application/
├── deps/
│ ├── buffer/
│ │ ├── buffer.c
│ │ └── buffer.h
│ └── other/
│ ├── other.c
│ └── other.h
├── objs/
├── application.c
└── Makefile
这是我的 Makefile
CC = gcc
APP_NAME = application
OBJS_PATH = objs
DEPS_PATH = deps
DEPS_NAME = buffer other
DEPS = $(patsubst %,$(OBJS_PATH)/%.o,$(DEPS_NAME))
$(OBJS_PATH)/%.o: $(DEPS_PATH)/%/%.c
$(CC) -o $@ -c $^
$(APP_NAME): $(DEPS)
$(CC) -o $@ $@.c $^
all: $(APP_NAME)
这是我输入 make 时的错误:
make: *** No rule to make target `objs/buffer.o', needed by `application'. Stop.
最佳答案
在确定问题的根本原因之前,为每个 *.c 到 *.o 编译步骤建议一个单独的目标。
您希望“all”目标成为 makefile 中的第一个目标。 (这就是“all”目标的用途,因此可以使用以下命令调用 makefile:
make
没有在 make 文件中指定目标
注意:“all”是一个虚假目标(不生成名为“all”的文件) 所以应该写成类似:
.PHONY: all
all : $(app_name) $(DEPS)
当 make 执行编译步骤时 它需要知道如何找到头文件。 由于头文件是分散的, 可能建议 1) 在编译规则中列出所有路径/*.h 文件(简单但可能导致不需要的编译)或 2) 生成依赖文件。(困难,但随着文件数量的增长最好)或 3 )为每个源文件编写单独的编译规则。 (最不灵活,但对于新手来说很容易制作)
编译规则需要有参数来指示在哪里可以找到头文件。 (在 gcc 中,使用 '-I./other/.' 和 '-I./buffer/.)
关于c - Makefile:没有使用变量创建目标的规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30789191/