gpt4 book ai didi

gcc - 如何让 Makefile 自动重建包含修改后的头文件的源文件? (在 C/C++ 中)

转载 作者:行者123 更新时间:2023-12-03 05:06:08 29 4
gpt4 key购买 nike

我有以下 makefile,用于构建我正在开发的程序(实际上是内核)。它是从头开始的,我正在学习这个过程,所以它并不完美,但我认为它对于我编写 makefile 的经验水平来说已经足够强大了。

AS  =   nasm
CC = gcc
LD = ld

TARGET = core
BUILD = build
SOURCES = source
INCLUDE = include
ASM = assembly

VPATH = $(SOURCES)

CFLAGS = -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions \
-nostdinc -fno-builtin -I $(INCLUDE)
ASFLAGS = -f elf

#CFILES = core.c consoleio.c system.c
CFILES = $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c)))
SFILES = assembly/start.asm

SOBJS = $(SFILES:.asm=.o)
COBJS = $(CFILES:.c=.o)
OBJS = $(SOBJS) $(COBJS)

build : $(TARGET).img

$(TARGET).img : $(TARGET).elf
c:/python26/python.exe concat.py stage1 stage2 pad.bin core.elf floppy.img

$(TARGET).elf : $(OBJS)
$(LD) -T link.ld -o $@ $^

$(SOBJS) : $(SFILES)
$(AS) $(ASFLAGS) $< -o $@

%.o: %.c
@echo Compiling $<...
$(CC) $(CFLAGS) -c -o $@ $<

#Clean Script - Should clear out all .o files everywhere and all that.
clean:
-del *.img
-del *.o
-del assembly\*.o
-del core.elf

此 makefile 的主要问题是,当我修改一个或多个 C 文件包含的头文件时,C 文件不会重建。我可以通过让所有头文件成为所有 C 文件的依赖项来很容易地解决这个问题,但这会在我更改/添加头文件时有效地导致项目的完全重建,这不会很优雅。

我想要的只是包含我更改的头文件的C文件被重建,并且整个项目被再次链接。我可以通过使所有头文件成为目标的依赖项来进行链接,但我无法弄清楚如何在 C 文件包含的头文件较新时使 C 文件无效。

我听说 GCC 有一些命令可以实现这一点(因此 makefile 可以以某种方式找出需要重建哪些文件),但我一生都找不到一个实际的实现示例来查看。有人可以发布一个解决方案来在 makefile 中启用此行为吗?

编辑:我应该澄清一下,我熟悉将各个目标放入并使每个 target.o 需要头文件的概念。这需要我每次在某个地方包含头文件时都编辑 makefile,这有点痛苦。我正在寻找一种可以自行派生头文件依赖项的解决方案,我相当确定我在其他项目中已经看到过这种解决方案。

最佳答案

正如本网站其他地方已经指出的,请参阅此页面: Auto-Dependency Generation

简而言之,gcc 可以自动为您创建 .d 依赖文件,这些文件是包含您编译的 .c 文件的依赖项的迷你 makefile 片段。每次更改 .c 文件并编译时,.d 文件都会更新。

除了向 gcc 添加 -M 标志之外,您还需要在 makefile 中包含 .d 文件(就像 Chris 上面写的那样)。页面中有一些更复杂的问题可以使用 sed 解决,但是您可以忽略它们,并在 make 提示无法构建不再存在的头文件时执行“make clean”来清除 .d 文件.

关于gcc - 如何让 Makefile 自动重建包含修改后的头文件的源文件? (在 C/C++ 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/297514/

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