makefile详解——1

-------------------------------------------------------------------
---------------------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)
-----------------------------------------------------------------------------



























  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

byd yes

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值