c语言学习笔记二十一
makefile中关于变量的语法规则
示例代码如下:
foo = $(bar)
bar = Huh?
all:
@echo $(foo)
执行make后输出: Huh?
优点: 可以把变量的值推迟到后面定义
示例代码:
main.o:main.c
$(CC) $(CFAGS) $(CPPFLAGS) -C $<
CC=gcc
#编译选项
CFAGS= -O -g
#预处理选项
CPPFLAGS= -Iinclude
编译展开后为:
gcc -O -g -Iinclude -c main.c
示例代码:
x := foo
#$(x)会立即展开
y := $(x) bar
#定义一个变量的值是空格
nullstring :=
space := $(nullstring)
x := fbb
#$(x)不会立即展开
# y如果没有定义过,就按=处理,如果已经定义就不作任何操作
y ?= $(x) bar
objects = main.o
#可以给变量追加值
#如果objects = main.o用=定义,不会立即展开
#objects := main.o用:=定义,会立即展开
objects += $(foo)
foo = foo.o bar.o
all:
@echo "-$(y)-"
@echo "--$(space)--"
@echo "---$(y)---"
@echo "----$(objects)----"
输出结果为:
-foo bar-
-- --
----foo bar---
----main.o foo.o bar.o----
常用的特殊变量有:
$@,表示规则中的目标。
$<,表示规则中的第一个条件。
$?,表示规则中所有比目标新的条件,组成一个列表,以空格分隔。
$^,表示规则中的所有条件,组成一个列表,以空格分隔。
示例代码:
test34:test34.o test33.o test31.o
(这里是个tab) gcc test34.o test33.o test31.o -o test34
可以改写为:
test34:test34.o test33.o test31.o
(这里是个tab) gcc $^ -o $@
示例代码如下:
libsome.a: foo.o bar.o lose.o wino
#只有更新过的目标文件才会重新打包
arr r libsome.a $?
示例代码如下:
foo = $(bar)
bar = Huh?
all:
@echo $(foo)
执行make后输出: Huh?
优点: 可以把变量的值推迟到后面定义
示例代码:
main.o:main.c
$(CC) $(CFAGS) $(CPPFLAGS) -C $<
CC=gcc
#编译选项
CFAGS= -O -g
#预处理选项
CPPFLAGS= -Iinclude
编译展开后为:
gcc -O -g -Iinclude -c main.c
示例代码:
x := foo
#$(x)会立即展开
y := $(x) bar
#定义一个变量的值是空格
nullstring :=
space := $(nullstring)
x := fbb
#$(x)不会立即展开
# y如果没有定义过,就按=处理,如果已经定义就不作任何操作
y ?= $(x) bar
objects = main.o
#可以给变量追加值
#如果objects = main.o用=定义,不会立即展开
#objects := main.o用:=定义,会立即展开
objects += $(foo)
foo = foo.o bar.o
all:
@echo "-$(y)-"
@echo "--$(space)--"
@echo "---$(y)---"
@echo "----$(objects)----"
输出结果为:
-foo bar-
-- --
----foo bar---
----main.o foo.o bar.o----
常用的特殊变量有:
$@,表示规则中的目标。
$<,表示规则中的第一个条件。
$?,表示规则中所有比目标新的条件,组成一个列表,以空格分隔。
$^,表示规则中的所有条件,组成一个列表,以空格分隔。
示例代码:
test34:test34.o test33.o test31.o
(这里是个tab) gcc test34.o test33.o test31.o -o test34
可以改写为:
test34:test34.o test33.o test31.o
(这里是个tab) gcc $^ -o $@
示例代码如下:
libsome.a: foo.o bar.o lose.o wino
#只有更新过的目标文件才会重新打包
arr r libsome.a $?