Makefile:没有规则用变量制作目标

时间:2015-06-11 18:56:53

标签: 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.

3 个答案:

答案 0 :(得分:0)

在确定问题的根本原因之前,为每个* .c到* .o编译步骤建议一个单独的目标。

你想要'所有' target是makefile中的第一个目标。 (这就是'所有'目标的用途,因此可以使用以下命令调用makefile:

make

未在make文件中指定目标

注意:'所有'是一个虚假的目标(没有产生名为' all'的文件) 所以应该写成类似于:

.PHONY: all
all : $(app_name) $(DEPS) 

当make执行编译步骤时 它需要知道如何查找头文件。 由于头文件是分散的, 可能建议1)列出编译规则中的所有路径/ * .h文件(简单但可能导致不必要的编译)或2)生成依赖文件。(困难,但最好随着文件数的增长)或3 )为每个源文件写一个单独的编译规则。 (最不灵活,但对新手来说很容易)

编译规则需要具有指示在何处查找头文件的参数。 (在gcc中,使用' -I./other /.'和' -I./buffer /.)

答案 1 :(得分:0)

我从未见过多个词干引用。看起来它很难混淆解析器。

好的一面似乎是

$(OBJS_PATH)/%.o: $($(DEPS_PATH)/%/%.c)

诀窍。不要问我为什么。

答案 2 :(得分:0)

将目标文件放在源文件的同一目录中我解决了这个Makefile的问题

CC = gcc
CFLAGS = -Ideps
APP_NAME = application

DEPS_SOURCE = $(wildcard deps/*/*.c)
DEPS_OBJECT = $(DEPS_SOURCE:.c=.o)

all: $(APP_NAME)

$(APP_NAME): $(DEPS_OBJECT)
    $(CC) $@.c -o $@ $(DEPS_OBJECT) $(CFLAGS)

%.o: %.c
    $(CC) -o $@ -c $^

clean:
    rm -f $(DEPS_OBJECT) $(APP_NAME)

.PHONY: all clean

使用此解决方案,当我在项目中添加其他deps时,我不必更改Makefile。