我正在开发一个 C 项目,我决定将源代码及其对象放在不同的目录中。根目录有类似这样的内容:
SmartC ▶ tree -L 1
.
├── built
├── doc
├── Makefile
├── README.md
├── src
├── tests
└── trash
因此,在 src 和built 目录中,我放置了另外两个Makefile 来完成编译和链接作业。
src 目录(我放置源代码的位置)具有以下结构:
src
├── graph.c
├── graph.h
├── list.c
├── list.h
├── main.c
├── Makefile
├── node.c
├── node.h
├── tree.c
├── tree.h
└── types
├── complex.c
├── complex.h
├── matrix.c
└── matrix.h
和built具有相同的结构,但它的目的是存储编译生成的所有对象。
我的问题是关于我的 src/Makefile:
BINDIR = ../built/src
CC = gcc
CFLAGS = -g -Wall -O3
OBJECTS = \
$(BINDIR)/main.o \
$(BINDIR)/node.o \
$(BINDIR)/list.o \
$(BINDIR)/graph.o \
$(BINDIR)/tree.o \
$(BINDIR)/types/complex.o \
$(BINDIR)/types/matrix.o \
compile: $(OBJECTS)
$(BINDIR)/%.o: %.c
$(CC) -c $< -o $@ $(CFLAGS)
该 Makefile 在 src 目录中创建源代码的所有对象,并将它们移动到built/src。但是,每次创建新的源代码文件(*.c)时,我都必须将其对象的名称放入此 makefile 中,以便可以对其进行编译。我想在 src 目录内进行自动搜索,并用此搜索填充“OBJECTS”变量。
有人知道如何实现这一目标吗?我的意思是,自动搜索特定目录中的源代码?
我什至接受任何其他策略而不是我正在制定的策略。
===========答案===============
我得到了关于通配符的提示(在评论中)。所以我做了。这是我找到的解决方案。
源文件/生成文件
BINDIR = ../built/src
CC = gcc
CFLAGS = -g -Wall -O3
OBJECTS := $(patsubst %.c,$(BINDIR)/%.o,$(wildcard *.c */*.c))
compile: $(OBJECTS)
$(BINDIR)/%.o: %.c
$(CC) -c $< -o $@ $(CFLAGS)