这是我的第一个 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}
$<
表示这里,和 .c.o
?.c.o: ${CC} ${CFLAGS} -c $<
最佳答案
首先,您的 Makefile
有一个错误,它没有达到预期的目标。你试了吗?
二是写得不好;不遵循当前的最佳实践。
因此,我将首先向您展示 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}
,是由空格分隔的单词组成的字符串,对于每个单词,替换后缀.c
与 .o
.我掉线了.
在我的代码中,因为不需要它,并且通常只替换点后的后缀。如果您熟悉这种语法,则此语法类似于 bash 字符串后缀替换(对于一个单词)。
$<
在“配方”中使用时,表示“第一个先决条件”-:
之后的第一件事在上面的行中。最后一个问题不再相关:
.o.c
语法已过时,目前不推荐使用。请看看我的“十诫”——我在这篇文章中的回答:
makefile enforce library dependency ordering
,他们会让您了解最佳实践。然后你也可以阅读 GNU Make 手册,关于上面引号中的术语,我没有在这里解释。
关于c - 使用 .c=.o 和 $< 理解 Makefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26133377/