c - Makefile:没有使用变量创建目标的规则

标签 c makefile

我正在尝试编写一个 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/

相关文章:

windows - 使 : *** No rule to make target `all' . 停止。 eclipse 错误

c - 在 Linux 中创建静态库时出现问题

linux - Makefile 缺少分隔符

c - 为什么这个程序输出4?

c - 为什么这些构造使用增量前和增量后未定义的行为?

c - printf 在此程序中如何将十进制转换为二进制?

c - 如何使 `make` 为文件夹中的每个 C 文件创建一个可执行文件?

java - 如何检查Windows版本是否是正版?

c - 为什么 y 没有被取消引用?

g++ - Makefile 构建目录和依赖项列表