Makefile的重要性:会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力
一、Makefile概述
make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
“自动化编译”:一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率
提升编译效率:再次编译,只编译修改的文件
二、Makefile基本语法
target... : prerequisites ...
command
target也就是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label),对于标签这种特性,在后续的“伪目标”章节中会有叙述。
prerequisites就是,要生成那个target所需要的文件或是目标。
command也就是make需要执行的命令,需要用Tab键空一格。(任意的Shell命令)
三、Makefile的变量
1.Makefile创建变量的目的
用来代替一个文本字符串:
1)系列文件的名字
2)传递给编译器的参数
3)需要运行的程序
4)需要查找源代码的目录
5)你需要输出信息的目录
6)你想做的其它事情。
#目标:依赖
# 命令
#一步编译.c->exe
#test:add.c sub.c test.c
# gcc add.c sub.c test.c -o test
#两步编译.c->.o->exe
test:add.o sub.o test.o
echo $(LDFLAGS)
gcc add.o sub.o test.o -o test
add.o:add.c
gcc -c add.c -o add.o
sub.o:sub.c
gcc -c sub.c -o sub.o
test.o:test.c
gcc -c test.c -o test.o
#伪目标
.PHONY:clean
clean:
rm *.o
2.自定义变量
x = a 变量在声明时需要给予初值
$(x)或${x} 取值
如果你要使用真实的 $ 字符,那么你需要用 $$ 来表示。
3.Makefile变量的赋值
符号 | 作用 |
= | 是最基本的赋值方式,与在文中位置无关,系统自动推导将最终的赋值作为该变量的值。 |
?= | 作用是当某变量前面已经定义赋值过,则不执行本次定义赋值,否则执行本次赋值 |
:= | 是覆盖式赋值,假如某变量在前面已经定义赋值过,则将本次赋值作为最新的变量值 |
+= | 追加赋值,旧值保持不变,将新值黏贴到旧值后面 |
#变量的定义和赋值
#SRC = add.o sub.o test.o
SRC = add.o
SRC += sub.o
SRC += test.o
#两步编译.c->.o->exe
test:$(SRC)
gcc ${SRC} -o test
add.o:add.c
gcc -c add.c -o add.o
sub.o:sub.c
gcc -c sub.c -o sub.o
test.o:test.c
gcc -c test.c -o test.o
#伪目标
.PHONY:clean
clean:
rm *.o
4.自动变量
$* 不包含扩展名的目标文件名称
$+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件
$< 第一个依赖文件的名称
$? 所有时间戳比目标文件晚的的依赖文件,并以空格分开
$@ 目标文件的完整名称
$^ 所有不重复的目标依赖文件,以空格分开
$% 如果目标是归档成员,则该变量表示目标的归档成员名称
#自动变量
#SRC = add.o sub.o test.o
SRC = add.o
SRC += sub.o
SRC += test.o
#两步编译.c->.o->exe
test:$(SRC)
gcc ${SRC} -o $@
#@echo $$+ = $+
#@echo $^
#@echo $<
add.o:add.c
gcc -c $^ -o $@
#echo $*
#echo $@
sub.o:sub.c
gcc -c $^ -o $@
test.o:test.c
gcc -c $^ -o $@
#伪目标
.PHONY:clean
clean:
rm *.o
四、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编译器的选项,无默认值。
LDFLAGS 链接器的选项,无默认值
CPPFLAGS C预编译的选项,无默认值。
CXXFLAGS C++编译器的选项,无默认值。
FFLAGS FORTRAN编译器的选项,无默认值
#隐含变量
#SRC = add.o sub.o test.o
SRC = add.o
SRC += sub.o
SRC += test.o
CC = gcc
#CC = arm-linux-gcc 你的环境如果没有该编译器,会报它找不到
CFLAGS = -c -g -Wall -I /home/linux/Makefile/include/
#两步编译.c->.o->exe
test:$(SRC)
$(CC) ${SRC} -o $@
%.o:%.c
$(CC) $(CFLAGS) $^ -o $@
#伪目标
.PHONY:clean
clean:
$(RM) *.o