gpt4 book ai didi

c - 在头文件更改期间重建 Makefile

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:04:03 25 4
gpt4 key购买 nike

我正在尝试为项目编写 Makefile。这样,每当任何 C 文件发生变化时,我都能够构建项目。但是,当头文件发生变化时,它不会构建。

所以,我正在尝试使用 Makefile 来获得更简单的目录结构,如果可行,我计划在主项目中做同样的事情。

目录结构是,

src -> code1 -> file1.c
src -> code2 -> file2.c
src -> code1inc -> file1.h
src -> code2inc -> file2.h

所有文件一起构建并给出一个二进制FinalBin

当 file1.h 发生变化时,它只需要构建 file1.c。我如何通过 Makefile 强加这个?

这是我当前的 Makefile。

CC = gcc

CFLAGS = $(INCLUDES)

TARGET = FinalBin

SOURCES := $(wildcard *.c)

PATH_CODE1 = src/code1
PATH_CODE2 = src/code2

CODE1_SOURCES := $(wildcard $(PATH_CODE1)/*.c)
CODE1_OBJECTS := $(patsubst %.c,%.o,$(CODE1_SOURCES))

CODE2_SOURCES := $(wildcard $(PATH_CODE2)/*.c)
CODE2_OBJECTS := $(patsubst %.c,%.o,$(CODE2_SOURCES))

PATH_CODE1INC = src/code1inc
PATH_CODE2INC = src/code2inc

INCLUDES = -I$(PATH_CODE1INC) \
-I$(PATH_CODE2INC)

CODE1_HEADERS := $(wildcard $(PATH_CODE1INC)/*.h)
CODE2_HEADERS := $(wildcard $(PATH_CODE2INC)/*.h)

all: $(TARGET)

obj1 = $(CODE1_OBJECTS) $(CODE1_HEADERS)
obj2 = $(CODE2_OBJECTS) $(CODE2_HEADERS)

$(TARGET) : $(obj1) $(obj2)
$(CC) $^ -o $@

clean:
rm $(TARGET) $(CODE1_OBJECTS) $(CODE2_OBJECTS)

请指导我。

最佳答案

我觉得你的所作所为很不寻常。

典型的方法是有一个源文件列表,可以手动编写或自动评估,例如通过从一个或多个目录中捕获所有 c 文件。这就是您已经执行的操作:CODE1_SOURCES := $(wildcard $(PATH_CODE1)/*.c)

但是每个文件的依赖应该是自动生成的。例如 gcc 提供 '-M' 或 '-MM' 选项来重建所谓的依赖文件,通常命名为 '.d' 或 '.dep'

完整过程的好文档可以在这里找到:

http://make.mad-scientist.net/papers/advanced-auto-dependency-generation/#basic

对于简单的情况,这是从上述文档中获取的示例:

SRCS = foo.c bar.c ...

%.o : %.c
@$(MAKEDEPEND); \
cp $*.Td $*.d; \
sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
-e '/^$$/ d' -e 's/$$/ :/' < $*.Td >> $*.d; \
rm -f $*.Td
$(COMPILE.c) -o $@ $<

include $(wildcard $(SRCS:.c=.d))

如果使用 gcc MAKEDEPEND 可以:

MAKEDEPEND = gcc -M $(CPPFLAGS) -o $*.Td $<

一个简短的解释:

通常,您定义如何从 %.o 文件生成 %.o 文件的规则:

%.o : %.c

作为该规则的第一步,如果必须编译源代码,通常是在 %.o 文件不存在或依赖项比 %.o 文件新的情况下始终构建 depfile:

gcc -M $(CFLAGS) -o $*.Td $<

摘录中给出的最后一行确实包含了所有这些自动生成的依赖文件,只需将它们包含到 Makefile 本身中:

include $(wildcard $(SRCS:.c=.d))

关于c - 在头文件更改期间重建 Makefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48421816/

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