gpt4 book ai didi

Makefile 通用目标规则

转载 作者:行者123 更新时间:2023-12-03 06:31:37 25 4
gpt4 key购买 nike

我正在尝试改进我在 makefile 中使用的简单解决方案(用于编译目标的单一规则和用于将所有先前目标链接在一起的附加规则)。我想出了以下 Makefile(已剪辑):

.PHONY: clean

BASE_DIR = ../

CC = gcc
CROSS_COMPILE = arm-none-eabi-
CFLAGS =-g -I${BASE_DIR}/include
LDFLAGS =-L${BASE_DIR}/lib -Ttarget.ld -nostdlib

SOURCES = first.c second.c third.c fourth.c
OBJECTS = $(SOURCES:.c=.o)
EXECUTABLE = $(OBJECTS:.o=)

all: $(EXECUTABLE)

%:
${CROSS_COMPILE}$(CC) $(CFLAGS) $(LDFLAGS) $*.c -o $*

clean:
rm ${EXECUTABLE}

这工作正常,但我想将编译和链接过程分开。因此我尝试修改如下:

.PHONY: clean

BASE_DIR = ../

CC = gcc
CROSS_COMPILE = arm-none-eabi-

CFLAGS =-c -g -I${BASE_DIR}/include
LDFLAGS =-L${BASE_DIR}/lib -Ttarget.ld -nostdlib

SOURCES = first.c second.c third.c fourth.c
OBJECTS = $(SOURCES:.c=.o)
EXECUTABLE = $(OBJECTS:.o=)

all : $(EXECUTABLE)

%.o : %.c
@echo "Compiling c file into o file"
${CROSS_COMPILE}$(CC) $(CFLAGS) $< -o $@

% : %.o
@echo "Linking o file into executable"
${CROSS_COMPILE}$(CC) $(LDFLAGS) $< -o $@

clean:
rm ${EXECUTABLE}

这工作正常,然后我调用 Makefile,例如: make first.o; make first或者如果我修改 EXECUTABLE = $(OBJECTS:.o=)EXECUTABLE = $(OBJECTS:.o=.out)% : %.o%.out : %.o 。但是,如果我尝试将编译调用为 makemake first使用隐式规则。

我尝试阅读 Makefile 手册,但里面的信息确实很多,我有点困惑。

如何修改 Makefile 以允许调用构建单独的目标为 make <target>或所有目标 make同一时间?

最佳答案

您描述问题的段落非常困惑且难以理解。提出问题时,请确保描述问题的部分是最清楚的:如果您提供示例输出,准确显示您键入的命令和得到的结果,并解释您期望得到的结果,这会很有帮助。

但是,我的解释是,如果您运行 make first ,它会使用内置规则直接从 first.c 编译 first ,而不是您的模式规则(请注意,内置规则和您的模式规则都被视为“隐式规则”)。

这是因为 make 将选择“较短”的隐式规则链,因此将首选直接从源代码一步构建可执行文件的规则,而不是分两步构建对象然后可执行文件。如果您不想使用内置隐式规则,则需要使用 -r 标志调用 make,否则 delete it通过添加:

% : %.c

(仅此)到你的 makefile。

关于Makefile 通用目标规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23494088/

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