理解带有.c=.o和$〈的Makefile

vshtjzan  于 2023-01-29  发布在  其他
关注(0)|答案(2)|浏览(219)

这是我的第一个Makefile,我不明白其中使用的一些语法。问题标记如下:

C := gcc

CFLAGS := -Wall -Werror -std=

PROG := program_1\
    program_2\
    program_3

SRCS := program_1.c \
    program_2.c \
    program_3.c

OBJS := ${SRCS:.c=.o} 

all: ${OBJS}
  ${CC} ${OBJS} -o ${PROG}

clean:
    rm -f ${PROG} ${OBJS}

.c.o:
    ${CC} ${CFLAGS} -c $<
  1. .c=.o是什么意思?在OBJS := ${SRCS:.c=.o}
    1.不确定$<在这里是什么意思,还有.c.o
    .c.o: ${CC} ${CFLAGS} -c $<
6mw9ycah

6mw9ycah1#

首先,你的Makefile有一个bug,它没有达到预期的目标。你试过吗?
第二,它写得不好;未遵循当前最佳实践。
因此,我将首先向您展示Makefile的更好版本,它们都是正确的,并且使用最佳实践编写:

CFLAGS := -Wall -Werror -std=

SRCS := program_1.c \
    program_2.c \
    program_3.c

OBJS := ${SRCS:c=o} 
PROGS := ${SRCS:.c=}

.PHONY: all
all: ${PROGS}

${PROGS} : % : %.o Makefile
    ${CC} $< -o $@

clean:
    rm -f ${PROGS} ${OBJS}

%.o: %.c Makefile
    ${CC} ${CFLAGS} -c $<

现在,你们问题的答案是:
${SRCS:.c=.o}的意思是,取变量值${SRCS},它是一个由空格分隔的单词组成的字符串,对于每个单词,用.o替换后缀.c。我在代码中删除了.,因为它不需要,而且通常只替换点后面的后缀。
这个语法类似于bash字符串后缀替换(对于一个单词),如果您熟悉的话。
$<在“配方”中使用时,意思是“第一个先决条件”-上一行中:之后的第一件事。
最后一个问题已经不重要了.o.c语法已过时,当前不推荐使用。
请看看我的“十诫”-我的答案在这个职位:
makefile强制库依赖关系排序
,他们会给予你一个关于最佳实践的想法。然后你也可以阅读GNU Make手册,关于上面引号中的术语,我在这里没有解释。

xdyibdwo

xdyibdwo2#

您没有明确指定您使用的是make的哪个变体--有很多变体,我将假设您使用的是GNU make,它是使用最广泛的变体。
在GNU make中,$(SRCS:.c=.o)是一个替换引用,它表示“SRCS变量的值,其中.c在出现在单词末尾时被.o替换”。在您的示例中,SRCS的值为program_1.c program_2.c program_3.c,因此$(SRCS:.c=.o)表示program_1.o program_2.o program_3.o
.c.o是一个老式的 suffix rule 的例子,它告诉GNU make“这是如何从一个同名的.c文件构建一个.o文件”。现代的等价物是一个 pattern rule,除了用%.o: %.c代替.c.o之外,看起来都一样。
最后,$<是一个自动变量,表示“第一个先决条件的名称”。

相关问题