c - 使用 .c=.o 和 $< 理解 Makefile

标签 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 $<
  • 什么.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/

    相关文章:

    c - 前缀树实现

    c++ - 从缓冲区指针计算堆栈中的返回地址

    c - 如何将每个数字扫描到数组槽中?

    c - 在 opencv 序列中需要帮助!

    c - 当 typedef 是全局而非局部时,为什么定义与函数同名的 typedef 会出错?

    shell - Makefile:将命令行参数传递给 Makefile 内的文件

    gcc - 如何防止警告遮盖GCC中的错误

    makefile - Makefile 中的目标 ".cpp.o:"意味着什么?

    linux - 无法从 Makefile 执行 shell 命令

    linux - 如何在 Linux 上运行 libsvm?