gpt4 book ai didi

c - 使用静态模式规则会导致单个源更改重建所有

转载 作者:行者123 更新时间:2023-11-30 14:32:41 24 4
gpt4 key购买 nike

我正在尝试修复由于缺乏对 .c 源文件的依赖而当前无法检测源文件更改的 Makefile。我已经实现了静态模式规则,但当单个源文件更改时无法重建单个对象文件。它将重建所有更改。

我有以下内容:

ARCHITECTURE_DIR = arm
BUILD_DIR = build
OUTPUT_DIR = $(BUILD_DIR)/$(ARCHITECTURE_DIR)
SDK_DIR = sdks/v4.0

SOURCE_FILES = \
$(SDK_DIR)/alarm.c \
...

CSOURCES = $(filter %.c, $(SOURCE_FILES))

COBJS = $(addprefix $(OUTPUT_DIR)/,$(CSOURCES:.c=.o))
all: PROLOGUE $(COBJS)
$(LD) $(COBJS) -o ...

以前,该文件具有以下内容:

$(COBJS): %.o:
@echo 'Building $(notdir $(@:%.o=%.c))...'
@$(CC) $(CFLAGS) -o $@ $(filter %$(@:$(OUTPUT_DIR)/%.o=%.c),$(CSOURCES)) > /dev/null \

但这不依赖于 .c 文件,因此无法识别所做的更改和重建。我不想在每次更改源时进行清理。我将其更改为以下内容:

COBJS = $(CSOURCES:.c=.o)

$(COBJS): %.o: %.c
@echo 'Building $(notdir $(@:%.o=%.c))...'
@$(CC) $(CFLAGS) -o $(addprefix $(OUTPUT_DIR)/,$@) $< > /dev/null \

但这会导致每次都重新构建,因为目标文件被放入不同的目录中。有没有办法让它可以找到这些目标文件并且在必要时不重建?

感谢您的帮助!

最佳答案

不确定我完全理解您想要在哪里存储不同的产品,但让我们尝试一下。根据您显示的 Makefile,我假设您希望与 sdks/v4.0/alarm.c 对应的目标文件为 build/arm/sdks/v4.0/alarm .o。我还将假设您的目标可执行文件是 build/arm/sdks/v4.0/my_executable

  1. 您可以修改编译模式规则以使用真实的源文件和目标文件:

    $(OUTPUT_DIR)/%.o: %.c
    @echo 'Building $(@F)...'
    @mkdir -p $(@D)
    @$(CC) $(CFLAGS) -o $@ $<

    请注意,配方在编译之前创建目标目录 (mkdir -p ...),并且它使用自动变量 ($(@F)$(@D)) 获取目标的基本名称和目录。

  2. 您可以使用真实的目标文件作为链接规则,以避免无用的重建;当然,您也可以使用虚假目标作为真实目标的别名:

    EXEC := $(OUTPUT_DIR)/$(SDK_DIR)/my_executable
    ...
    .PHONY: all
    all: $(EXEC)
    ...
    $(EXEC): PROLOGUE $(COBJS)
    $(LD) $(COBJS) -o $@

总而言之,您可以尝试以下操作:

ARCHITECTURE_DIR := arm
BUILD_DIR := build
OUTPUT_DIR := $(BUILD_DIR)/$(ARCHITECTURE_DIR)
SDK_DIR := sdks/v4.0
SOURCE_FILES := \
$(SDK_DIR)/alarm.c \
...
CSOURCES := $(filter %.c,$(SOURCE_FILES))
COBJS := $(patsubst %.c,$(OUTPUT_DIR)/%.o,$(CSOURCES))
EXEC := $(OUTPUT_DIR)/$(SDK_DIR)/my_executable

.PHONY: all
all: $(EXEC)

$(EXEC): PROLOGUE $(COBJS)
$(LD) $(COBJS) -o $@

$(OUTPUT_DIR)/%.o: %.c
@echo 'Building $(@F)...'
@mkdir -p $(@D)
@$(CC) $(CFLAGS) -c -o $@ $<

关于c - 使用静态模式规则会导致单个源更改重建所有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59724739/

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