【发布时间】:2018-09-07 17:02:43
【问题描述】:
我有一个 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 命令时,它返回以下错误消息:
汇编程序消息:致命错误:无法创建 obj/main.o:没有这样的文件 或目录
有什么想法可以实现我想要的吗?
【问题讨论】:
-
您将源代码分布在目录树中而不是全部在同一个目录中,同时尝试编写一个 动态的
Makefile/i> 发现并构建所有源。这并没有超出 GNUmake的能力范围,但是您为使其工作所付出的努力可能最好花在以不同的方式解决问题上。 -
替代方法包括将所有源代码手写到 Makefile 中(可能在
ls命令的输出中使用管道),或者至少制作所有子目录的静态列表,或者在每个子目录中设置一个单独的 Makefile 并执行一个很好的旧递归make。 -
还有更好的方法来保持源目录干净,例如设置和执行 VPATH 构建。