linux makefile编写,linux的makefile文件如何编译

linux makefile编写,linux的makefile文件如何编译,Linux下Makefile的编写与使用详解

大家好,本文主要讲Linux下Makefile的编写和使用的详细讲解。有兴趣的同学过来看看。如果对你有帮助,记得收藏起来下次浏览。

目录

MakefileMakefile命名和规则Makefile如何工作Makefile变量Makefile函数Makefile清理规则

Makefile

一个项目文件中可能有许多源文件,以及不同的函数、模块等。放在不同的目录中。常规编译无法高效处理此类问题,Makefile就是为了解决这个问题而来。

一旦编写了Makefile,只需要一条make指令就可以完成Makefile中编写的所有指令,从而编译整个项目文件,极大的提高了效率

Make是一个命令工具,用来解释Makefile中的命令。

Makefile文件命名和规则

文件命名

makefile或Makefile都可以使用。

Makefile规则

Makefile中的命令规则如下:

Xxx(目标文件):xxx(从属文件)

(制表符)命令(shell命令)

其中,目标文件是最终要生成的文件(伪目标除外),依赖文件是生成目标文件所需的文件,命令是shell命令。

注意,在命令之前必须有一个制表符缩进。

例如:

#生成文件

App: A.C.B.C #目标:依赖

Gcc a.c b.c -o app #注意这行开头的缩进。

make以上这个Makefile会把目录里的a.cb.c编译成目标文件app

Makefile的工作原理

Makefile中的命令在执行前,会检查是否存在所需的依赖文件

如果存在:执行命令

If不存在:向下检查其他规则,查看是否存在其他规则生成当前规则所需的任何依赖关系。如果是,请执行此规则中的命令。

例如:

#生成文件

app:a . o . b . o

gcc a . o . b . o-o应用程序

美国航空公司

海湾合作委员会

英国广播公司

海湾合作委员会

在上面的Makefile中,当你执行app规则时,会发现当前目录中不存在所需的依赖文件a.o和b.o,于是你会往下看,看是否有其他规则生成这个文件。当你找到a.o规则时,你会执行gcc -c a.c -o a.o,B.O,同样的道理。

Makefile在执行规则中的命令时,会比较目标文件和依赖文件的修改时间

如果从属文件晚于目标文件的修改时间,即最后一次目标生成后进行过修改年,将重新生成目标文件。

如果依赖文件早于目标文件的修改时间,即最后一次目标生成后没进行修改年,则不会执行相应的命令。

例如,如果对Makefile使用make两次,第二次将提示您输入make:"app"已是最新

利用这个特性,我们会分层生成依赖项和目标,也就是最上面的第二个Makefile,这样当我们只修改a.c文件时,make只会再次执行a.o规则和app规则,b.o规则因为b.c没有被修改而不会被执行,这样可以大大减少资源的浪费。

Makefile变量

虽然上面可以减少编译代码的重复,但是如果有1000个。c .h文件,写一个Makefile会浪费很多时间。因此,我们应该采用一些变量来提高效率。

变量的获取

我们用$(变量名)来使用变量。

自定义变量

我们用变量名 = 变量值比如var = hello自定义我们需要的变量。

例如,顶部的第一个Makefile可以重写为:

#生成文件

rsc=交流

App: $(rsc) # Target: Dependence

Gcc $(rsc) -o app #注意这一行开头的缩进。

预定义的变量

有些变量是系统预定义,我们可以直接用。

Ar:档案维护程序的名称。默认值为AR。

cc: c编译器的名称,默认值为cc。

cx: c编译器的名称,默认值为g。

$ @:目标的全名

$:第一个相关文件的名称

$:所有相关文件的名称

为了理解下面的例子,我们先简单解释一下Makefile中的模式匹配。

%.o:%.c中,%是通配符,匹配一个字符串,而%匹配同一个字符串。

例如,顶部的第二个Makefile可以重写为:

#生成文件

RCS=a . o . b . o

应用程序:$(rcs)

$(CC) $(rcs) -o $@

%.o: %。上面的规则将执行这个规则两次。

$(抄送)-c $ -o $@

Makefile函数

我们可以看到,上面的Makefile比较简单,但是仍然没有解决项目中很多文件的问题。rcs的获取还是需要我们输入每一个需要编译的文件。然后,我们必须使用函数来为我们编写这些依赖文件。

$(wildcard PATTERN. . .)

这个函数的作用是获取指定目录中指定类型的文件。

参数模式是某个目录下的某个类型的文件,多个目录和类型可以用空格隔开。

返回值是几个文件的文件列表,文件名用空格分隔。

例如:

$(通配符。/*.C)返回当前目录中所有后缀为C的文件。

$(patsubst pattern, replacement, text)

这个函数的作用是找出文本中的单词是否符合模式,如果符合,就用替换进行替换。

模式可以包含通配符%。如果%包括在替换中,替换中的%将与模式中的%一致。

返回值是被替换的字符串。

例如:

$(patsubst %)。c,%。o,a.c,b.c)返回a.o,b.o

这样,我们上面的例子可以改写为:

#生成文件

rcs=$(通配符。/*.c)

objs=(patsubst %)。c,%。o,$(src))

应用程序:$(对象)

$(抄送)$(目标)-o $@

%.o: %。上面的规则将执行这个规则两次。

$(抄送)-c $ -o $@

Makefile clean规则

我们执行make命令后,会发现当前目录下还有很多O后缀的文件,但我们只需要最后的目标文件app,其他的都是多余的。我们做什么呢干净的规则将帮助我们处理它们。

clean

我们只需要将clean规则添加到Makefile的末尾,就可以在每次编译后执行clean规则中的命令。比如:

#生成文件

rcs=$(通配符。/*.c)

objs=(patsubst %)。c,%。o,$(src))

应用程序:$(对象)

$(抄送)$(目标)-o $@

%.o: %。上面的规则将执行这个规则两次。

$(抄送)-c $ -o $@

清洁:

Rm $(objs) -f #rm指令删除-f迭代删除

但是你会发现当前目录下多了一个干净的目标文件,仍然会采用Makefile的策略。相对于修改时间,我们往往会及时执行清理,但仍然无法清理文件。然后,我们需要下一个操作。

我们将clean定义为一个伪目标,即.假的:干净。然后它不会生成一个目标文件,没有比较,每次都会执行。

例如:

#生成文件

rcs=$(通配符。/*.c)

objs=(patsubst %)。c,%。o,$(src))

应用程序:$(对象)

$(抄送)$(目标)-o $@

%.o: %。上面的规则将执行这个规则两次。

$(抄送)-c $ -o $@。假的:干净的#伪目标

清洁:

Rm $(objs) -f #rm指令删除-f迭代删除

本文关于Linux Makefile的编译和使用的详细讲解到此为止。关于Linux Makefile的编译和使用的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: