这是我的第一个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}
不确定$&lt;在这里,和.c.o? .c.o: $ {CC} $ {CFLAGS} -c $&lt;
答案 0 :(得分:6)
首先,您的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字符串后缀替换(对于一个单词)。
$<
用于&#34;配方&#34;,表示&#34;第一个先决条件&#34; - 上面一行:
之后的第一件事。
并且最后一个问题不再相关:.o.c
语法已过时,目前不推荐。
请查看我的&#34; 10诫命&#34; - 我在这篇文章中的回答:
makefile enforce library dependency ordering
,他们会让您了解最佳做法。然后你也可以阅读GNU Make手册,关于引号中的上述术语,我在这里没有解释。
答案 1 :(得分:1)
您没有准确指定您正在使用的make
的哪个变体 - 有很多。我将假设你使用的是最广泛使用的GNU make。
在GNU make中,$(SRCS:.c=.o)
是substitution reference,它表示“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
是已知old-fashioned suffix rule的示例。它告诉GNU make“这里是如何使用相同的名称从.c文件构建.o文件。”现代等价物是模式规则,除了使用%.o: %.c
代替.c.o
之外,它们看起来一样。
最后,$<
是automatic variable,表示“第一个先决条件的名称”。