make命令概述
make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
使用make可以提升编译效率(一方面是简化了重复的命令,另一方面是只编译修改的文件)
变量的赋值
符号 | 作用 |
---|---|
= | 是最基本的赋值方式,与在文中位置无关,系统自动推导将最终的赋值作为该变量的值。 |
?= | 作用是当某变量前面已经定义赋值过,则不执行本次定义赋值,否则执行本次赋值 |
:= | 是覆盖式赋值,假如某变量在前面已经定义赋值过,则将本次赋值作为最新的变量值 |
+= | 追加赋值,旧值保持不变,将新值黏贴到旧值后面 |
自动变量
符号 | 作用 |
---|---|
$* | 不包含扩展名的目标文件名称 |
$+ | 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件 |
$< | 第一个依赖文件的名称 |
$? | 所有时间戳比目标文件晚的的依赖文件,并以空格分开 |
$@ | 目标文件的完整名称 |
$^ | 所有不重复的目标依赖文件,以空格分开 |
$% | 如果目标是归档成员,则该变量表示目标的归档成员名称 |
隐含变量
变量名 | 说明 |
---|---|
AR | 库文件维护程序的名称,默认值为ar。 |
AS | 汇编程序的名称,默认值为as。 |
CC | C编译器的名称,默认值为cc。 |
CPP | C预编译器的名称,默认值为$(CC) –E。 |
CXX | C++ 编译器的名称,默认值为g++。 |
FC | FORTRAN编译器的名称,默认值为f77 |
RM | 文件删除程序的名称,默认值为rm -f |
ARFLAGS | 库文件维护程序的选项,无默认值。 |
ASFLAGS | 汇编程序的选项,无默认值。 |
CFLAGS | C编译器的选项,无默认值。 |
LDFLAGS | 链接器的选项,无默认值。 |
CPPFLAGS | C预编译的选项,无默认值。 |
CXXFLAGS | C++编译器的选项,无默认值。 |
FFLAGS | FORTRAN编译器的选项,无默认值。 |
练习题
有fun1.c、fun2.c、hand.h和main.c文件,编写一个makefile文件
SRC = $(wildcard *.c) #获取目录下所有后缀名为.c的文件名称
OBJ = $(patsubst %.c, %.o, ${SRC}) #把SRC字符串里面所有的.c文件名称替换成.o
FWK = X86
#条件编译
ifeq (${FWK}, X86)
CC = gcc
endif
CFLAGS = -c -g -Wall
test:${OBJ}
${CC} $^ -o $@
%.o:%.c
${CC} $(CFLAGS) $^ -o $@
#伪目标
.PHONY:clean
clean:
${RM} *.o
#rm -f *.o
编译结果