makefile

首先我们来简单介绍一下makefile,有时候我们使用Linux命令行很不方便,例如输入很长的命令行,或者一系列的命令来编译某个文件的时候,这时候我们就可以使用makefile,makefile我们可以理解为是一种简单的脚本,当我们在命令行输入make命令的时候,系统会在当前路径下寻找名为makefile,Makefile,或GUNmakefile的文件,并执行这个文件里的内容。

1,makefile的基本语法

这里我们教大家如何简单使用makefile,makefile功能强大,大家在看完这篇文章后,可以去了解更多关于makefile的知识,makefile的语法与shell脚本相似,大家也可以去了解一下shell脚本。

首先makefile大概有三种元素,分别是,目标,依赖和动作,目标是一个代号,即你要完成什么,依赖是你完成这个目标所需要的文件,或其他目标等等,动作就是我们为了实现这个目标,让系统执行的操作,比如gcc,rm -rf等命令。

#makefile 中用#来进行注释

#赋值语法:这里我们讲解三种

VAR = testvalue 				#var变量被强制赋值为testvalue。
VAR ?=testvalue1 			    #若var未被赋值,那么就赋值为testvalue1,若在此语句前已经赋值,那么就忽略。
VAR +=testvalue2				#在之前定义的var值后面追加testvalue2值,例如之前var已经被赋值testvalue,
								#此时+=后,var的值就变成了testvaluetestvalue2。

#总目标,makefile中的第一个目标就是总目标,后面跟的是实现这个目标需要的依赖。
#依赖可以是工作路径下的某个文件,也可以是某个目标,若依赖某目标,则需要先执行这个被依赖的目标。
#例如总目标all就会先执行target1中的动作,结束后接着执行all目标的动作。
all: depend1 depend2 target1 
[TAB]action1    #这个目标要实行什么动作,例如gcc 。。。 rm -rf等命令。
	 action2	#注意,动作前必须是TAB而不是空格。
	 
target1:
	action
	
target2:
	action

#运行makefile时,默认会打印执行了的动作,如果不需要打印这些信息,可以将@加在action之前,便不会打印action了。
#若要取出某个变量中的值,可以用${变量}的形式,取出其中的值。

2,makefile例程

#定义变量,指定生成的静态库和动态库的名字
LIBNAME=mylib

#定义一个变量指定库文件和头文件的安装路径
INSTPATH=`pwd`/../lib    #``会提取pwd的命令结果

#定义编译器,若今后交叉编译,那么只需要更改这里就可以了
CC=gcc
AR=ar

#总目标,包括静态库编译和动态库编译
all: dynamic_lib static_lib
	@make clear
	@make install
	
#动态库编译
dynamic_lib:
	${CC} -shared -fPIC *.c -o lib${LIBNAME}.so

#静态库编译
static_lib:
	${CC} -c *.c
	${AR} -rcs lib${LIBNAME}.a *.o

#安装库
install:
	cp -rf lib${LIBNAME}.* ${INSTPATH}
	cp -rf *.h ${INSTPATH}

#删除执行文件
clear:
	rm -rf *.o

#删除库
clean: clear
	rm -rf lib${LIBNAME}.*