-------------------------------------------------------------------
---------------------make 详解-1 ----------------------------------
-------------------------------------------------------------------
----------------2012年12月26日18:58:16-----------------------------
-------------------------------------------------------------------
①make的基本概念
make3个重要的概念:
1.目标 2.依赖关系 3.命令
一个简单的Makefile文件:
-------------------------------------------------------------------
all:
echo "hello world"
test:
echo "just for test"
-------------------------------------------------------------------
all就是目标
执行make all的结果如下:
-------------------------------------------------------------------
echo "hello world"
hello world
-------------------------------------------------------------------
执行make test结果如下:
-------------------------------------------------------------------
echo "just for test"
just for test
-------------------------------------------------------------------
从上可以看出
*** all参数告诉make希望构建的目标是哪个
*** 如果直接执行make则默认的构建目标是第一个
-------------------------------------------------------------------
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-------------------------------------------------------------------
讲上面的内容作一些修改
-------------------------------------------------------------------
all:test
@echo "hello world"
test:
@echo "just for test"
-------------------------------------------------------------------
分析:all依赖于test
则执行make会出现的结果是:
-------------------------------------------------------------------
just for test
hello world
-------------------------------------------------------------------
make test 结果是:
-------------------------------------------------------------------
just for test
-------------------------------------------------------------------
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
②创建基本的编译环境
构造一个简单的程序用于写Makefile
simple/foo.c
-------------------------------------------------------------------
#include<stdio.h>
void foo()
{
printf("This is foo()");
}
-------------------------------------------------------------------
simple/main.c
-------------------------------------------------------------------
int main()
{
foo();
return 0;
}
-------------------------------------------------------------------
编写简单的Makefile
simple/Makefile
-------------------------------------------------------------------
all:main.o foo.o
gcc -o simple main.o foo.o
main.o:main.c
gcc -o main.o -c main.c
foo.o:foo.c
gcc -o foo.o -c foo.c
clean:
rm simple main.o foo.o
--------------------------------------------------------------------
*** make是通过文件的时间戳来判断定哪些文件需要从新编译的
make在分析一个规则以创建目标时,如果发现先决条件中的文件时间戳大于目标文件
的时间戳,即先决条件中的文件比目标更新。
②.1让Makefile更专业
一.假目标的用处
执行make clean时,make将认为clean当做一个目标来处理,然后clean目标没有任
何先决条件,所以当我们构建clean目标时,它会认为clean文件是最新的,从而拒
绝进行真正的文件清理操作。
*** 目标文件与Makefile中的目标名重名在现实项目中是很难避免的,假目标(phony
*** target)概念的提出正是为了解决这种问题。
*** 假目标采用.PHONY关键字来定义,注意必须是大写字母。
-------------------------------------------------------------------
.PHONY:clean
all:main.o foo.o
gcc -o simple main.o foo.o
main.o:main.c
gcc -o main.o -c main.c
foo.o:foo.c
gcc -o foo.o -c foo.c
clean:
rm simple main.o foo.o
--------------------------------------------------------------------
采用.PHONY关键字声明一个目标后,make并不会将其当做一个文件来处理,可以想象
由于假目标并不与文件关联,所以每次构建假目标时它所在规则中的命令一定会被执
行
二.运用"变量"提高可维护性
--------------------------------------------------------------------
.PHONY:clean
CC = gcc
RM = rm
EXE = simple
OBJS = main.o foo.o
$(EXE):$(OBJS)
$(CC) -o $(EXE) -c $(OBJS)
main.o:main.c
$(CC) -o main.o -c main.c
foo.o:foo.c
$(CC) -o foo.o -c foo.c
clean:
$(RM) -fr $(EXE) $(OBJS)
---------------------------------------------------------------------
*** 定义变量时其值可以为空,即无右值
*** 引用变量需要采用的方式为"$()","${}".
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
重点:
$@:用于表示一个规则中的目标。当一个规则中有多个目标时,$@所指的是其中任何造
成规则命令被运行的目标。
$^:表示的是规则中的所有先决条件。
$<:表示的是规则中的第一个先决条件。
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
下面这个经典的例子:
---------------------------------------------------------------------
.PHONY:all
all: first second third
@echo "\$$@ = $@"
@echo "$$^ = $^"
@echo "$$< = $<"
first second third:
---------------------------------------------------------------------
make的输出结果是:
---------------------------------------------------------------------
$@ = all
$^ = first second third
$< = first
---------------------------------------------------------------------
*** 注意$@对于Bash shell有特殊的意思要在"$$@"之前加一个脱字符"\"
用$@,$^,$<编写Makefile文件
---------------------------------------------------------------------
.PHONY:clean
CC = gcc
EXE = simlpe
OBJS = main.o foo.o
RM = rm -rf
$(EXE):$(OBJS)
$(CC) -o $@ $^
main.o:main.c
$(CC) -o $@ -c $^
foo.o:foo.c
$(CC) -o $@ -c $^
clean:
$(RM) *.o $(EXE)
----------------------------------------------------------------------
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
变量的类别与赋值
三种类型:1.":=" 2."?=" 3."+="
":=":简单扩展变量,对于这种变量,make只对其进行一次展开(意思就是make只认第一
次赋值)。
"?=":条件赋值,当变量没有定义时就可以定义它,并且将右边的值赋值给它;如果变量
已经定义了,则无法改变其原值,。条件赋值可以为变量赋默认值。
"+=":追加赋值。
----------------------------------------------------------------------------
将创建的simple可执行文件放到exes目录
讲生成的.o文件放到objs目录
----------------------------------------------------------------------------
.PHONY:clean
CC = gcc
MKDIR = mkdir
DIR_OBJS = objs
DIR_EXES = exes
DIRS = $(DIR_OBJS) $(DIR_EXES)
EXE = simple
SRCS = $(wildcard *.c) #通配符得到后缀为.c的文件
OBJS = $(SRCS:.c=.o)
OBJS := $(addprefix $(DIR_OBJS)/,$(OBJS))
RM = rm
FLAGES = -rf
all:$(DIRS) $(EXE)
$(DIRS):
$(MKDIR) $@
$(EXE):$(OBJS)
$(CC) -o $@ $^
$(DIR_OBJS)/%.o:%.c
$(CC) -o $@ -c $^
clean:
$(RM) $(FLAGES) $(DIRS) $(EXE)
-----------------------------------------------------------------------------
makefile详解——1
最新推荐文章于 2021-09-03 10:52:53 发布