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}.*