Makefile 基础
使用make进行项目管理,需要一个Makefile文件,make在进行编译的时候,从Makefile文件中读取设置情况,进行解析后运行相关的规则。make程序查找当前目录下的文件Makefile或makefile,按照其规则运行。
1 #生成cacu,":"右边为目标
2 cacu:add_int.o add_float.o sub_int.o sub_float.o main.o
3 gcc -o cacu add/add_int.o add/add_float.o\
4 sub/sub_int.o sub/sub_float.o main.o
5
6 #生成add_int.o的规则,将add_int.c编译成目标文件add_int.o
7 add_int.o:add/add_int.c add/add.h
8 gcc -c -o add/add_int.o add/add_int.c
9
10 #生成add_float.o的规则
11 add_float.o:add/add_float.c add/add.h
12 gcc -c -o add/add_float.o add/add_float.c
13
14 #生成sub_int.o的规则
15 sub_int.o:sub/sub_int.c sub/sub.h
16 gcc -c -o sub/sub_int.o sub/sub_int.c
17
18 #生成sub_float.o的规则
19 sub_float.o:sub/sub_float.c sub/sub.h
20 gcc -c -o sub/sub_float.o sub/sub_float.c
21
22 #生成main.o的规则
23 main.o:main.c add/add.h sub/sub.h
24 gcc -c -o main.o main.c -Iadd -Isub
25
26 #清理的规则
27 clean:
28 rm -f cacu add/add_int.o add/add_float.o \
29 sub/sub_int.o sub/sub_float.o main.o
1、规则的基本格式:
TARGET...:DEPENDEDS...
COMMAND...
...
...
TARGET:规则所定义的目标。通常规则是最后生成的可执行文件的文件名或者是为了生成可执行文件而依赖的目标文件的文件名,也可以是一个动作,称之为“伪目标”
DEPENDEDS:执行此规则所必须的依赖条件。
COMMAND:规则所执行的命令,即规则的动作,例如编译文件,生成库文件,进入目录等。命令可以是多个,每个占一行。
2、Makefile匹配模式
在上面的Makefile文件中,main.o规则的书写方式如下:
main.o:main.c add/add.h sub/sub.h
gcc -c -o main.o main.c -Iadd -Isub
有一种简便的方法可以实现与上面相同的功能:
main.o:%o:%c
gcc -c $< -o $@
这种方法的规则main.o中依赖项中的“%o:%c”的作用是将TARGET域的.o的扩展名替换为.c,即将main.o替换为main.c。而命令行的$<表示依赖项的结果,即main.c;%@表示TARGET域的名称,即main.o。
3、Makefile中的预定义变量
变 量 名 | 含 义 | 默 认 值 |
AR | 生成静态库文件的程序名称 | ar |
AS | 汇编编译器的名称 | as |
CC | C语言编译器的名称 | cc |
CPP | C语言预编译器的名称 | $(CC) -E |
CXX | C++语言编译器的名称 | g++ |
FC | FORTRAN语言编译器的名称 | f77 |
RM | 删除文件程序的名称 | rm -f |
ARFLAGS | 生成静态库库文件程序的选项 | 无默认值 |
ASFLAGS | 汇编语言编译器的编译选项 | 无默认值 |
CFLAGS | C语言编译器的编译选项 | 无默认值 |
CPPFLAGS | C语言预编译器的编译选项 | 无默认值 |
CXXFLAGS | C++语言编译器的编译选项 | 无默认值 |
FFLAGS | FORTRAN语言编译器的编译选项 | 无默认值 |
之前冗长的Makefile可以简化如下方式:
1 CC = gcc
2 CFLAGS = -Iadd -Isub -O2 (O2为优化)
3 TARGET = cuca
4 OBJS = add/add_int.o add/add_float.o sub/sun_int.o sub/sub_float.o main.o
5 RM = rm -f
6
7 $(TARGET):$(OBJS)
8 $(CC) -o $(TARGET) $(OBJS) $(CFLAGS)
9
10 $(OBJS):%o:%c
11 $(CC) -c $(CFLAGS) $< -o $@
12 clean:
13 $(RM) $(TARGET) $(OBJS)
4、Makefile中的自动变量
变 量 | 含 义 |
$* | 表示目标文件的名称,不包含目标文件的扩展名 |
$+ | 表示所有的依赖文件,这些依赖文件之间以空格分开,按照出现的先后为顺序,其中能包含重复的依赖文件 |
$< | 表示依赖项中的第一个依赖文件的名称 |
$? | 依赖项中,所有目标文件时间戳晚的依赖文件,依赖文件之间以空格分开 |
$@ | 目标项中目标文件的名称 |
$^ | 依赖项中,所有不重复的依赖文件。这些文件之间以空分开 |