一. Makefile 简化
如下的编译规则写法,当一个项目中的 C 源码文件很多时,如果 Makefile 复杂的时候这种重复输入的工作就会非常费时间。利用 Makefile 自动化变量可以解决这个问题。
main: main.o swap.o
gcc -o main main.o swap.o
二. Makefile基本语法
1. Makefile 变量
Makefile 中可以使用变量,代表了一个文本字符串,定义好后可以用美元符号 $
引用。
变量类似 C的宏定义,在使用中直接展开
- 变量的命名字可以包含字符、数字,下划线(可以是数字开头),但不应该含有
:
、#
、=
或是空字符(空格、回车等)。 - 变量是大小写敏感的,“foo”、“Foo”和“FOO”是三个不同的变量名。
- 变量在声明时需要给予初值;
传统的 Makefile 的变量名是全大写的命名方式。
使用变量时候:一般最好使用 ${ARGs} 或 $(ARGS) 这种括号表示对应的ARGS 变量,前面的变量可以调用后面定义的变量);
如下所示:
#可以相互调用,然后展开
value1 = $(value2) #调用后面定义的变量;
value2= $(value3)
value3 = Huh
all:
echo $(value1) #最终的结果就是Hug
有一些预定义的默认变量,历史原因名称已经约定俗成,可以输入命令 “make -p” 打印查看。
这些预定义的变量可分为两类:
- 表示程序名称(如CC)
- 表示程序参数(如CFLAGS)
程序名称的常见变量如下:
CC:表示C语言编译程序; 默认值:`cc’
CXX:表示C++语言编译程; 默认值:`g++’
表示程序参数的常见变量,如果没有说明,默认值是空字符串:
CFLAGS:C语言编译程序参数
LDFLAGS: 指定编译器的连接器参数, 默认值:`ld’
除了上述的这些变量名,还有其他的变量名。各种表示的意思可以网上百度。
2. Makefile 模式规则
Makefile 中的模式规则类似于通配符功能。最常见的通配符: * , 代表一个或多个字符;符号 % 代表非空字符串匹配;
模式规则通过通配符
% 为某一类文件定义编译规则。
所有的 .c 文件多编译为 .o文件,写法如下:
%.o : %.c
编译命令
注意:在变量定义中使用通配符,当定义变量为*.o 时候: 如果通配符表达式匹配不到任何合适的对象,通配符语句本身就会被赋值给变量;
3. Makefile 自动化变量
上述模式规则中,编译命令即需要涉及 Makefile 的自动化变量。
自动化变量如下:
$@
| 规则的目标文件名 |
$< | 规则的第一个依赖文件名。如果依赖文件是以模式(即“%”)定义的,那么 “$<” 就是符合模式的一系列的文件集合。 |
$^ |
所有依赖文件的集合,使用空格分开,如果在依赖文件中有多个重复的文件,
“
$^
”会去除重复的依赖文件,值保留一份。
|
$%
|
当目标是函数库的时候表示规则中的目标成员名,如果目标不是函数库文件,
那么其值为空。
|
$? | 所有比目标新的依赖目标集合,以空格分开。 |
$+
|
和“
$^
”类似,但是当依赖文件存在重复的话不会去除重复的依赖文件。
|
$*
|
这个变量表示目标模式中
"%"
及其之前的部分,如果目标是
test/a.test.c
,目标模
式为
a.%.c
,那么“
$*
”就是
test/a.test
。
|
常用的自动化变量有三种:$@、$< 和 $^。如下为自动化变量的使用:
objects = main.o input.o calcu.o
main: $(objects)
gcc -o main $(objects)
%.o : %.c
gcc -c $< #自动化变量
下一篇继续介绍 Makefile 的一些基本语法规则,包括伪目标,条件判断,函数调用。