gpt4 book ai didi

c - 在 Makefile 中获取源代码结构

转载 作者:行者123 更新时间:2023-12-01 08:58:38 24 4
gpt4 key购买 nike

我正在处理一个 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)

最佳答案

编辑[已解决]

我喜欢做以下事情。

为项目的每个目录创建变量

SRCDIR = src                                                           
OBJDIR = obj
LIBDIR = lib
DOCDIR = doc
HDRDIR = include

CFLAGS = -g -Wall -O3

递归只获取SRCDIR的内部结构

STRUCTURE := $(shell find $(SRCDIR) -type d)     

获取 STRUCTURE 变量中的所有文件

CODEFILES := $(addsuffix /*,$(STRUCTURE))
CODEFILES := $(wildcard $(CODEFILES))

仅过滤掉特定文件

# Filter Only Specific Files                                
SRCFILES := $(filter %.c,$(CODEFILES))
HDRFILES := $(filter %.h,$(CODEFILES))
OBJFILES := $(subst $(SRCDIR),$(OBJDIR),$(SRCFILES:%.c=%.o))

# Filter Out Function main for Libraries
LIBDEPS := $(filter-out $(OBJDIR)/main.o,$(OBJFILES))

现在是创建规则的时候了

compile: $(OBJFILES)

$(OBJDIR)/%.o: $(addprefix $(SRCDIR)/,%.c %.h)
$(CC) -c $< -o $@ $(CFLAGS)

通过这种方法,您可以看到我使用 STRUCTURE 变量只是为了获取 SRCDIR 目录中的文件,但它也可以用于其他目的,例如一旦 STRUCTURE 仅存储内部子目录。在清理操作后非常有用,例如:

clean:
-rm -r $(OBJDIR)/*

注意:只有当每个 *.c 都有相应的 *.h 文件(我的意思是具有相同的基本名称)时,编译规则才有效。

关于c - 在 Makefile 中获取源代码结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31974007/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com