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 $?

你可能感兴趣的:(c语言学习笔记二十一)