使用.c = .o和$<了解Makefile

时间:2014-10-01 02:50:12

标签: c makefile

这是我的第一个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}

  2. 不确定$&lt;在这里,和.c.o? .c.o:     $ {CC} $ {CFLAGS} -c $&lt;

2 个答案:

答案 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,表示“第一个先决条件的名称”。