gpt4 book ai didi

C Makefile - 不同文件结尾的子目录

转载 作者:行者123 更新时间:2023-11-30 14:57:23 25 4
gpt4 key购买 nike

我目前正在尝试制定一个可以用于多个项目的 Makefile,而无需为每个项目更改它。然而我最近开始用 C 编程并制作 Makefile

这是我当前的项目结构。

project
| src
| gd.c, gd.h, geom.c(only file with main function)
| obj // *.o files should be created here
| bin // executable should be created here
| Makefile

这是我迄今为止构建的内容,但完全不确定如何指定编译/链接文件的子目录。

 1  TARGET = projectname
2 LIBS = -lm
3 CC = gcc
4 CFLAGS = -std=c11 -Wall
5 LD = gcc
6 LDFLAGS = -Wall
7
8 SRCDIR = src
9 OBJDIR = obj
10 EXEDIR = bin
11
12 SOURCES =
13 HEADERS =
14 OBJECTS =
15
16 $(EXEDIR)/$(TARGET): $(OBJECTS)
17 $(LD) $(OBJECTS) $(LDFLAGS) -o $@ $(LIBS)
18
19 $(OBJECTS): $(SOURCES) $(HEADERS)
20 $(CC) $(CFLAGS) -c $< -o $@
21
22 .PHONY: clean
23 clean:
24 rm -f *.o
25
26 .PHONY: remove
27 remove: clean
28 rm -f $(EXEDIR)/$(TARGET)

我的问题是:

  1. 如何创建这些文件并将它们与我的布局或类似的内容一起放入各自的子目录中?
  2. 使用 make 命令时是否可以创建必要的文件夹(obj 和 bin),如果可以,我该怎么做?

最佳答案

如果我理解得很好,您想知道 - 在您的布局中 - 如何设置 SOURCES、HEADERS 和 OBJECTS 值以使您的 Makefile 正常工作。

为此,您可以使用正则表达式:

SOURCES = $(wildcard $(SRCDIR)/*.c)
OBJECTS = $(patsubst $(SRCDIR)/%.c,$(OBJDIR)/%.o,$(SOURCES))
HEADERS = $(patsubst %.c,%.h,$(SOURCES))

wildcard文档 here

patsubst文档 here

这是一个简单的答案,如果您想创建一个完全可重用的 Makefile,您将必须处理例如源子文件夹。

创建对象的规则很奇怪(也许它有效)。我认为如果您使用规则一次使用一个源创建一个对象会更好,例如:

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

在这种情况下,SOURCES 变量变得毫无用处。

此外,我认为 HEADERS 变量是无用的,因为在编译过程中,您不会向 gcc 提供 header ,而是提供带有 gcc ... -I<headers folder> 的 header 文件夹。

你的清洁应该是 rm -f $(OBJDIR)/*.o删除 obj 中的目标文件文件夹

编辑

我忘记了第二个问题,你可以在创建文件之前使用shell命令创建文件夹:

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

关于C Makefile - 不同文件结尾的子目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43965756/

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