这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 我的一段makefile理解文档

共1条 1/1 1 跳转至

我的一段makefile理解文档

菜鸟
2004-12-30 20:37:54     打赏
一:简介

Make是一个linux下的工具。它接受makefile作为输入。根据makefile的规则对所写的程序进行编译。这个makefile是用户自己编写的。Make的工作原理就是根据各个文件的时间戳,决定哪个文件需要重新编译。如果原文件,准确一点说是规则的依赖文件,比目的要文件新,说明原文件之后肯定被改过了,则要重新编译原文件,否则就不要编译。在每个文件夹底下会有一个以makefile或者Makefile命名的文件。

二 规则

一个makefile一般是由像下面的规则构成的:

target ... : dependencies ...

command

...

...

target是目的文件,它是由原文件产生的可执行文件或者是目的文件。也可以是一个动作的名字,比如clean

dependency是用于产生目的文件的输入文件,可能一个目的文件依赖于多个输入文件。

Command是让make执行的动作。一个规则可有多个命令。它们各自另起一行。注意点:每个命令前面必须要放置一个tab字符。

比如下面的makefile:

##################makefile开始###################

OBJS = foo.o bar.o

CC = cc

CFLAGS = -Wall –O –g

myprog : $(OBJS)

$(CC) $(OBJS) –o myprog #行头有一tab

foo. foo.c foo.h bar.h

$(CC) $(CFLAGS) –c foo.c –o foo.o #行头有一tab

bar.o : bar.c bar.h

$(CC) $(CFLAGS) –c bar.c –o bar.o #行头有一tab

clean :

rm foo.o \ #行头有一tab

bar.o

###################makefile结束####################

它就是由一些规则构成的,另外在makefile中可以定义一些变量,以方面后续的引用。在这个makefile的最后,clean这条规则中,就没什么具体的什么目标文件,它的目标只是一个动作而以。可以看到,当一行上的内容太多写不下时,可以用反斜杆\来续行。

由于在makefile中,有隐含规则,所谓隐含规则是这样的,比如下面的编译规则:

foo. foo.c foo.h bar.h

cc –c foo.c –o foo.o #行头有一tab

在隐含规则下,makefile会根据foo. foo.c foo.h bar.h自动的用cc –c foo.c –o foo.o规则去编译编译foo.c文件。所以我们可以省略cc –c foo.c –o foo.o规则,因此上面的makefile文件可以写成:

##################makefile开始###################

OBJS = foo.o bar.o

CC = cc

CFLAGS = -Wall –O –g

myprog : $(OBJS)

foo. foo.c foo.h bar.h

bar.o : bar.c bar.h

clean :

rm foo.o \ #行头有一tab

bar.o

###################makefile结束####################

三 makefile的构成

一般来说makefile由下面几个元素构成:显式规则,隐式规则,定义的用户变量,目录,注释语句。

显式规则:就是用户在规则的动作下,用户自己定义的动作集合。

隐式规则:就是在用户不指定目标该执行的动作情况下,由make工具自动生成的默认隐含规则。

变量:就是用户用 = 符号赋值语句的左值,可以在变量定义的之后的语句中引用这个变量。三

目录:就是用include语句包含的别的makefile,在执行一个makefile的时候,可以跳转到别的makefile中去执行,执行完了后再返回到原有的makefile中去运行。

注释:注释语句就是用#开头的一行语句。

Makefile的命名一般命名为makefile或者Makefile,它放置在每一个文件夹底下,然后make工具在执行的时候,会寻找每一个目录文件夹底下的makefile文件,根据里面的规则来编译文件。

四:Makefile的条件编译

在makefile中,可以用ifdef,ifndef等等指令字来进行条件指令的编译。比如:

ifeq ($(CC),gcc)

$(CC) -o foo $(objects) $(libs_for_gcc)

else

$(CC) -o foo $(objects) $(other_normal_libs)

endif

上面的语句的意思就是如果编译器用的是gcc编译器的话,则库的引用就用libs_for_gcc库来编译目标文件。如果不是采用的gcc编译器的话,就采用另外的库other_normal_libs来编译目标文件。

条件编译指令还可以和函数结合起来使用,比如下面的规则:

archive.a: ...ifneq (,$(findstring t,$(MAKEFLAGS))) +touch archive.a +ranlib -t archive.aelse ranlib archive.aendif如果在MAKEFLAGS变量中没有包含-t编译参数,则添加一个,如果包含了就职金额编译。可以看出,函数的使用,让make在文本处理方面的能力加强了。

除了上面的findstring函数外,还有其他的好多函数,比如:subst,patsubst,strip,filter等等函数,不过在我们的makefile中用到的函数就是findstring函数。

下面就介绍一下这个函数,它的调用方法如下:

$(findstring find,in),如果在in字符串中存在find,则函数的返回值就是find,如果在字符串in中不存在find,则函数返回空。

以上就是makefile的基本内容,当然还有好多别的东西,我们了解这么多就足够了。



关键词: 我的     一段     makefile     理解     文档     规则         

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]