我有一个 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
和 .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)
但这似乎没有按预期工作,因为当我发出 make
命令时,它返回以下错误消息:
Assembler messages: Fatal error: can't create obj/main.o: No such file or directory
有什么想法可以实现我想要的吗?
最佳答案
似乎你在每一步之后都rm -rf obj/
,但是没有mkdir -p obj/
来代替它。
由于 GNU make
本身会删除中间目标,我不明白你为什么要这样做 $(RM) $(OBJ)
,但是你的 %.o
目标可能有这样一行
mkdir -p "$(shell dirname "$@")"
…以确保目标目录存在。
PS:你的输出被命名为 build
而不是 main
因为那是你给它的名字......
关于编译所有 C 文件并使用 Makefile 创建可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52226852/