Linux下Makefile简单教程要点Word文档格式.docx

上传人:b****3 文档编号:14411692 上传时间:2022-10-22 格式:DOCX 页数:19 大小:25.26KB
下载 相关 举报
Linux下Makefile简单教程要点Word文档格式.docx_第1页
第1页 / 共19页
Linux下Makefile简单教程要点Word文档格式.docx_第2页
第2页 / 共19页
Linux下Makefile简单教程要点Word文档格式.docx_第3页
第3页 / 共19页
Linux下Makefile简单教程要点Word文档格式.docx_第4页
第4页 / 共19页
Linux下Makefile简单教程要点Word文档格式.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

Linux下Makefile简单教程要点Word文档格式.docx

《Linux下Makefile简单教程要点Word文档格式.docx》由会员分享,可在线阅读,更多相关《Linux下Makefile简单教程要点Word文档格式.docx(19页珍藏版)》请在冰豆网上搜索。

Linux下Makefile简单教程要点Word文档格式.docx

以Linux下gcc-c编译器为例,编译一个c语言程序需要经过以下几个步骤:

1.将c语言源程序预处理,生成.i文件;

2.预处理后的.i语言编译成汇编语言,生成.s文件;

3.汇编语言经过汇编,生成目标文件.o文件;

4.将各个模块的.o文件链接起来,生成一个可执行程序文件。

我们知道,在VisualC++6.0中,可以新建一个工程,在一个工程当中能够包含若干个c语言文件,则编译的时候直接编译整个工程便可。

Linux下无法为多个c语言文件新建工程,但可以通过MakeFile实现它们的整合编译。

如上gcc-c编译步骤,如果使用Makefile则过程为:

.C文件——>

.o文件——>

可执行文件

当然,Makefile中也加入了自己的设置变量方法与集成了一些函数,能够更有效地方便用户使用。

 

/**************************分隔符********************************/

target...:

prerequisites...

command

...

target也就是一个目标文件,可以是ObjectFile,也可以是执行文件。

prerequisites就是,要生成那个target所需要的文件或是目标。

command也就是make需要执行的命令。

(任意的Shell命令)

为了方便理解,我们来看一个示例:

/*Makefile示例*/

edit:

main.okbd.ocommand.odisplay.o/

insert.osearch.ofiles.outils.o

gcc-oeditmain.okbd.ocommand.odisplay.o/

main.o:

main.cdefs.h#生成main.o

gcc-cmain.c

kbd.o:

kbd.cdefs.hcommand.h#生成kdb.o

gcc-ckbd.c

command.o:

command.cdefs.hcommand.h#生成command.o

gcc-ccommand.c

display.o:

display.cdefs.hbuffer.h#生成display.o

gcc-cdisplay.c

insert.o:

insert.cdefs.hbuffer.h#生成insert.o

gcc-cinsert.c

search.o:

search.cdefs.hbuffer.h#生成search.o

gcc-csearch.c

files.o:

files.cdefs.hbuffer.hcommand.h#生成files.o

gcc-cfiles.c

utils.o:

utils.cdefs.h#生成utils.o

gcc-cutils.c

clean:

rmeditmain.okbd.ocommand.odisplay.o/

/*END*/

执行输入:

make-sedit

反斜杠(/)是换行符的意思。

我们来回忆一下一个c语言编译的过程:

c语言文件:

main.c

1.gccmain.c-cmain.o

2.gccmain.o-omain

经过这两步便可以编译出可执行文件:

main。

现在我们再看上面的Makefile:

这两句便生成main.o文件(main.c与defs.h为用到的源文件)。

之后

edit:

main.o...

gcc-oeditmain.o...

便会生成main可执行文件;

同理,其他几个文件亦是。

“edit”便是最终编译出的可执行文件名。

可以看到Makefile只是整合了编译过程,也可以同时编译多个文件,其诞生的本质目的确实是为了实现自动化编译。

1.2隐式规则

make工具会自动使用gcc-c命令,将一个扩展名为.c的c语言程序源文件编译成一个同名的.o目标文件。

因此,在上例中,将:

改为:

defs.h

(即去掉源同名c语言文件名,其他几个文件亦是如此。

)这样便使用了隐式规则,隐式规则只是节省了敲代码的数量。

可以注意到上述示例中末尾有几行代码:

这几行代码并不会编译生成文件,可以把它们看成是Makefile里附加的实现小功能的程序(Makefile里藏了shell小程序),

这个名称为clean的目标便叫做伪目标。

我们可以直接输入:

makeclean来运行这个伪目标。

显然,此伪目标可以清除之前生成的.o目标文件以及edit执行文件。

为了防止命名的重复,可以使用.PHONY来显式地指明一个伪目标:

.PHONYclean

这样就不会对clean这个目标的性质定义产生混乱了。

/*********看完上面应该基本知道Makefile用途了******************/

1.4搜索源文件

在一些大的工程中,有大量的源文件,我们通常的做法是把这许多的源文件分类,并存放在不同的目录中。

所以,当make需要去找寻这些相关源文件时,需要在文件前加上路径,但最好的方法是把一个路径告诉make,让make自动去找。

Makefile文件中的特殊变量“VPATH”就是完成这个功能的,如果没有指明这个变量,make只会在当前的目录中去找寻依赖文件和目标文件。

如果定义了这个变量,那么,make就会在当前目录找不到的情况下,到所指定的目录中去找寻文件了。

VPATH=src:

../headers

上面的的定义指定两个目录,“src”和“../headers”,make会按照这个顺序进行搜索。

目录由“冒号”分隔。

(当然,当前目录永远是最高优先搜索的地方)。

另一个设置文件搜索路径的方法是使用make的“vpath”关键字(注意,它是全小写的),这不是变量,这是一个make的关键字,这和上面提到的那个VPATH变量很类似,但是它更为灵活。

它可以指定不同的文件在不同的搜索目录中。

这是一个很灵活的功能。

它的使用方法有三种:

1.vpath<

pattern>

<

directories>

为符合模式<

的文件指定搜索目录<

2.vpath<

清除符合模式<

的文件的搜索目录。

3.vpath

清除所有已被设置好了的文件搜索目录。

vpath使用方法中的<

需要包含“%”字符。

“%”的意思是匹配零或若干字符,例如,“%.h”表示所有以“.h”结尾的文件。

<

指定了要搜索的文件集,而<

则指定了<

的文件集的搜索的目录。

例如:

vpath%.h../headers

该语句表示,要求make在“../headers”目录下搜索所有以“.h”结尾的文件。

(如果某文件在当前目录没有找到的话)我们可以连续地使用vpath语句,以指定不同搜索策略。

如果连续的vpath语句中出现了相同的<

,或是被重复了的<

,那么,make会按照vpath语句的先后顺序来执行搜索。

如:

vpath%.cfoo

vpath%.cblish

vpath%.cbar

其表示“.c”结尾的文件,先在“foo”目录,然后是“blish”,最后是“bar”目录。

vpath%.cfoo:

bar

而上面的语句则表示“.c”结尾的文件,先在“foo”目录,然后是“bar”目录,最后才是“blish”目录。

/**************************分隔符*******************************/

为了增强Makefile的功能与增加程序的可移植性,Makefile中也使用了变量。

看个例子:

#此处为变量设置

CC=gcc

FLAGS=-c

objects=main.okbd.ocommand.odisplay.o/

$(objects)

CC-oedit$(objects)

CCFLAGSmain.c

CCFLAGSkbd.c

CCFLAGScommand.c

CCFLAGSdisplay.c

CCFLAGSinsert.c

CCFLAGSsearch.c

CCFLAGSfiles.c

CCFLAGSutils.c

rmedit$(objects)

此时,程序便有了很好的可修改性与移植性。

可以用变量定义变量的值,Makefile中有三种方式:

1.使用'

='

操作符

/*Makefile程序*/

you=$(me)

me=$(he)

he=she

all:

echo$(you)

执行:

make-sall

输出:

she

程序将变量me的值赋给you,而变量me的值为变量he的值,he的值为she,因此变量you的值为she。

Makefile中的变量值是可以使用后面的变量来定义的。

但这样有危险,例如:

a=$(b)

b=$(a)

将陷入无限

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 生产经营管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1