2.变量

变量的作用域

  1. 局部变量:在规则中声明的变量为局部变量。自动化变量是局部变量。

    # 此时CFLAGES的值是:-g
    prog: CFLAGES = -g
    
  2. 全局变量

赋值符号

 =          赋值
:=          赋值,但不使用未定义的变量
+=          追加赋值
override    修饰符,用来保护变量的值。使用该修饰符的变量,其值无法在命令行中进行修改。

自定义变量

自定义的变量跟C语言中的宏一样,文件执行前要进行替换。声明时要赋初值,书写时字符串之间用空格隔开

SRC_C = main.c add.c sub.c

变量可以用来相互赋值。甚至可以使用还未定义的变量进行赋值。

OBJ   = $(patsubst %.c, %.o, $(SRC_C))
SRC_C = main.c add.c sub.c

避免使用未定义的变量进行赋值可以使用:=

# OBJ的值为空
OBJ  := $(patsubst %.c, %.o, $(SRC_C))
SRC_C = main.c add.c sub.c

变量一些特殊的使用方法

  1. 赋值是进行替换

    # 赋值时进行替换的两种方法
    SRC_C = main.c add.c sub.c
    OBJ   = $(SRC_C:.c=.o)
    # 通过**模式匹配**进行替换
    OBJ   = $(SRC_C:%.c=%.o)
    
  2. 类似宏的用法

    # all的值为:Tony
    my_friend = Tony
    first     = my
    second    = friend
    all       = $($a_$b)
    

自动化变量

在前面已经提到过,自动化变量为局部变量

  • $@:目标文件集,sef.o
  • $^:依赖文件集,删除了重复的文件名。sef.c
  • $+:依赖文件集,未删除重复的文件名。

    sef.o: sef.c
        gcc -c %^ -o $@
    
  • $<:依赖文件集,注意是一个一个的取出来。add.c sub.c sef.c

    # 假设当前目录下有`add.c sub.c sef.c`文件
    add.o sub.o sef.o: %.o: %.c
        gcc -c %< -o %@
    
  • $*:“%”及其以前的部分。

  • $?:比目标新的依赖文件集。

有特殊意义的变量

MAKECMDGOALS —— 这个变量中会存放你所指定的终极目标的列表,“MAKECMDGOALS”,这个变量中会存放你所指定的终极目标的列表

你可能感兴趣的:(makefile)