我正在尝试编写一个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.
答案 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。