这是我的第一个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 $<
.c=.o
是什么意思?在OBJS := ${SRCS:.c=.o}
中
1.不确定$<
在这里是什么意思,还有.c.o
?.c.o: ${CC} ${CFLAGS} -c $<
2条答案
按热度按时间6mw9ycah1#
首先,你的
Makefile
有一个bug,它没有达到预期的目标。你试过吗?第二,它写得不好;未遵循当前最佳实践。
因此,我将首先向您展示Makefile的更好版本,它们都是正确的,并且使用最佳实践编写:
现在,你们问题的答案是:
${SRCS:.c=.o}
的意思是,取变量值${SRCS}
,它是一个由空格分隔的单词组成的字符串,对于每个单词,用.o
替换后缀.c
。我在代码中删除了.
,因为它不需要,而且通常只替换点后面的后缀。这个语法类似于bash字符串后缀替换(对于一个单词),如果您熟悉的话。
$<
在“配方”中使用时,意思是“第一个先决条件”-上一行中:
之后的第一件事。最后一个问题已经不重要了
.o.c
语法已过时,当前不推荐使用。请看看我的“十诫”-我的答案在这个职位:
makefile强制库依赖关系排序
,他们会给予你一个关于最佳实践的想法。然后你也可以阅读GNU Make手册,关于上面引号中的术语,我在这里没有解释。
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
之外,看起来都一样。最后,
$<
是一个自动变量,表示“第一个先决条件的名称”。