这是我的第一个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}
不知道$
Mark Galeck.. 9
首先,你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}
,这是一个由空格分隔单词组成的字符串,并且对于每个字,替换后缀.c
用.o
.我删除.
了我的代码,因为它不需要,并且通常只在点后面替换后缀.
如果您熟悉该语法,则此语法类似于bash字符串后缀替换(对于一个单词).
$<
当在"食谱"中使用时,意味着"第一个先决条件" - 在:
上面的行之后的第一件事.
并且最后一个问题不再相关: .o.c
语法已过时,目前不推荐.
请看看我的"十诫" - 我在这篇文章中的答案:
makefile强制库依赖顺序
,他们会给你一个关于最佳实践的想法.然后你也可以阅读GNU Make手册,关于引号中的上述术语,我在这里没有解释.
首先,你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}
,这是一个由空格分隔单词组成的字符串,并且对于每个字,替换后缀.c
用.o
.我删除.
了我的代码,因为它不需要,并且通常只在点后面替换后缀.
如果您熟悉该语法,则此语法类似于bash字符串后缀替换(对于一个单词).
$<
当在"食谱"中使用时,意味着"第一个先决条件" - 在:
上面的行之后的第一件事.
并且最后一个问题不再相关: .o.c
语法已过时,目前不推荐.
请看看我的"十诫" - 我在这篇文章中的答案:
makefile强制库依赖顺序
,他们会给你一个关于最佳实践的想法.然后你也可以阅读GNU Make手册,关于引号中的上述术语,我在这里没有解释.