我正在进行一个 C 项目的开发,我决定将源代码和它所生成的目标文件放在不同的目录中。根目录大致如下:
因此,在src和built目录中,我放置了两个其他的Makefile来完成编译和链接工作。
src目录(我放置源代码的地方)具有以下结构:
“built”指的是同样的结构,但它旨在存储编译生成的所有对象。
我的问题是关于我的src/Makefile:
该Makefile创建源代码中src目录下的所有对象,并将它们移动到built/src。但是,每次我创建一个新的源代码文件(*.c),我都必须在这个makefile中输入其对象的名称,以便进行编译。我想自动搜索src目录中的文件,并用此搜索填充“OBJECTS”变量。
有人有什么想法吗?我的意思是,在特定目录内自动搜索源代码?
我甚至接受除我正在做的之外的任何其他策略。
=========== 答案 ===============
我得到了关于通配符的提示(在评论中)。所以我这样做了。这是我找到的解决方案。
src/Makefile
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”变量。
有人有什么想法吗?我的意思是,在特定目录内自动搜索源代码?
我甚至接受除我正在做的之外的任何其他策略。
=========== 答案 ===============
我得到了关于通配符的提示(在评论中)。所以我这样做了。这是我找到的解决方案。
src/Makefile
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)