我有一个C项目,该文件具有以下文件结构:
Makefile
src
|-utils
| |--vic.c
| |--vic.h
|-mod
| |--type.c
| |--type.h
|-bb.c
|-bb.h
|-main.c
因此,在根目录下,我有实际的Makefile
和src
目录,其中包括源文件。在src
目录中,有多个.c
和.h
文件以及main.c
文件,还有其他目录也包含其他.c
和{{ 1}}个文件。请注意,为简洁起见,上面显示的文件结构简短。我想创建一个.h
,它将自动编译所有内容并生成可执行的Makefile
程序,还删除在编译过程中生成的目标文件。目前,我有这样的事情:
main
但是这似乎没有按预期方式工作,因为当我发出CC=gcc
CFLAGS=
RM=rm -rf
OUT=main
SRC=src
OBJ=obj
SOURCES=$(wildcard $(SRC)/*.c)
OBJECTS=$(patsubst $(SRC)/%.c, $(OBJ)/%.o, $(SOURCES))
all: build
build: $(OBJECTS)
$(CC) $(CFLAGS) $^ -o $@
$(RM) $(OBJ)
$(OBJ)/%.o: $(SRC)/%.c
$(CC) $(CFLAGS) -I$(SRC) -c $< -o $@
debug: CFLAGS+=-DDEBUG
debug: build
.PHONY: clean
clean:
$(RM) $(OBJ) $(OUT)
命令时,它会返回以下错误消息:
汇编程序消息:致命错误:无法创建obj / main.o:没有此类文件 或目录
有什么想法可以实现我想要的吗?
答案 0 :(得分:1)
似乎每个步骤之后您rm -rf obj/
,但是没有mkdir -p obj/
可以替换。
由于GNU make
本身会删除中间目标,所以我不明白您为什么会这么做$(RM) $(OBJ)
,但是您的%.o
目标可能会有一行
mkdir -p "$(shell dirname "$@")"
…以确保目标目录存在。
PS:您的输出名为build
而不是main
,因为这是您给它的名称…