一:Makefile中 变量 定义的方式:
1.递归展开方式,递归展开方式定义的变量是在引用在该变量时进行替换的,即如果该变量包含了对其他变量的 应用 ,则在引用该变量时一次性将内嵌的变量全部展开,虽然这种类型的变量能够很好地完成 用户 的指令,但是它也有严重的缺点,如不能在变量后追加内容(因为语句:CFLAGS = $(CFLAGS) -O在变量扩展过程中可能导致无穷循环)。
2.简单方式。用:=定义。为了避免上述问题,简单扩展型变量的值在定义处展开,并且只展开一次,因此它不包含任何对其它变量的引用,从而消除变量的嵌套引用。
3.用?=定义变量,它的含义是如果变量还没定义 ,即如果用户不定义,就提供给他默认的。
举例说明递归展开与简单方式定义的区别:
CFLAGS:=-Wall
CFLAGS:=$(CFLAGS)
all:
echo $(CFLAGS)
对于以上Makefile,执行make后echo输出-Wall
CFLAGS=-Wall
CFLAGS=$(CFLAGS)
all:
echo $(CFLAGS)
执行make后echo输出:Makefile:2:***Recursive variable `CFLAGS
GNU make 的主要预定义变量:
预定义变量 含义
$* 不包含扩展名的目标文件名称。
$+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。
$< 第一个依赖文件的名称。
$? 所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚。
$@ 目标的完整名称。
$^ 所有的依赖文件,以空格分开,不包含重复的依赖文件。
$% 如果目标是归档成员,则该变量表示目标的归档成员名称。例如,如果目标名称
为 mytarget.so(image.o),则 $@ 为 mytarget.so,而 $% 为 image.o。
AR 归档维护程序的名称,默认值为 ar。
ARFLAGS 归档维护程序的选项。
AS 汇编程序的名称,默认值为 as。
ASFLAGS 汇编程序的选项。
CC C 编译器的名称,默认值为 cc。
CCFLAGS C 编译器的选项。
CPP C 预编译器的名称,默认值为 $(CC) -E。
CPPFLAGS C 预编译的选项。
CXX C++ 编译器的名称,默认值为 g++。
CXXFLAGS C++ 编译器的选项。
FC FORTRAN 编译器的名称,默认值为 f77。
FFLAGS FORTRAN 编译器的选项。
参考:http://www.aka.org.cn/Lectures/001/Lecture-1/make.html
http://hi.chinaunix.net/?uid-14782631-action-viewspace-itemid-10165
http://www.sudu.cn/info/html/edu/20080407/264139.html
http://blog.csdn.net/lijierson8/article/details/6283040
http://www.worldhello.net/doc/makefile_howto/makefile_howto.mm.htm
经典的shell教程:《Linux Shell Scripting with Bash》—Ken O.Brutch的翻译
http://blog.csdn.net/fox_lht/article/details/5894940
陈皓专栏:
经典的makefile教程:跟我一起写makefile
http://blog.csdn.net/haoel/article/details/2886(http://www.chinaunix.net/jh/23/408225.html)
+
http://wenku.baidu.com/view/4a171e6a25c52cc58bd6be6b.html
GCC常用编译选项:优化选项的功能