MakeFile的学习

因为在使用C/C++的时候,会产生很多的.c/.cpp和.h文件,通常我们在使用platform进行编程时会通过预编译的命令将他们连接起来,但是有时对大型的工程项目,这样的方式并不灵活,也不利于维护,所以考虑使用MakeFile来进行文件的连接工作。

MakeFile学习:

一个小例子来说名MakeFile的构成和执行方式:

1.   #   makefile
2.   #   this   is   a   example   of   make   file
3.   all:a1   a2
4.       @echo   this   is   all!
5.   a1:
6.       @echo   this   is   a1!
7.   a2:
8.       @echo   this   is   a2!
上面MakeFile的运行结果是:

this is a1!

this is a2!

this is all!

代码详解:

第1 2行是注释部分。在MakeFile中用#作为注释,但是注意#不能用在其他语句之后,否则会出错。

第3行就是规则开始的部分。
all: a1     a2一行中all是规则的名字,通常是目标明(target)。

一条规则可以有不止一个名字,像上面的这行,也可以把它写成all  all2:a1   a2。这时,规则就有了两个名称—all和all2。当然,还可以有更多,都看自己。第5 7两行也是规则的开始部分。

在“:”之后的,就是依赖项。在这一行里,依赖项有两个,分别是a1和a2。这些依赖项可以是其它的规则名(目标名),也可以是文件名。依赖和目标之间的关系就是“依赖关系”。一条规则中,可以有零个(像后面的两条规则)、一个或多个依赖。

第4行的@echo  this   is   all!是命令行。它是执行all规则时要执行的命令。要注意的是,一条规则内的命令要以tab为一行的起始,以表示命令是属于一个规则。一条规则也可以有多条命令,每条命令占一行(要以tab开头)。至于可以使用哪些命令,这完全取决于使用的OS和SHELL。
当执行make时,它会找到第一条规则。然后,make就会检查依赖和目标之间的关系。如果目标比依赖旧,就执行规则,以更新目标。执行完规则就结束。

如何判定目标和依赖的新旧呢?

1 如果目标(文件)不存在,目标的时间就为0

2 如果目标(文件存在),目标的时间就为文件的修改时间。如果依赖项是一条规则,就执行依赖的规则(这里是一个递归),然后依赖的时间就是当前最新时间;

3 如果是一个存在的文件,就为文件的修改时间,否则就报错。

4 有一点特殊的是,在没有依赖项时,依赖的时间为1

之后,就可以比较目标和依赖之间的关系。
在这个例子中,make先找到规则“all”,发现目标不存在,所以目标的时间为0;然后再查找依赖“a1”,结果“a1”不存在,所以它的时间为0;于是,执行规则“a1”,而“a1”没有依赖,它的依赖时间为11>0,所以,执行规则“a1”。然后返回规则“all”,再检查依赖“a2”。“a2”执行过程同“a1”。这时,“all”的目标时间为0,依赖时间为最新时间。于是,执行规则“all”的命令。
当然,也可以指定一条规则让make执行,比如:make  a1这个命令就是告诉make程序不去找第一条规则,而是规则“a1”来执行。并且还可以一次执行多条规则,比如:执行make   a1  a2就会连续执行“a1”、“a2”两条规则。

==============================================
依赖的基本写法如下:
Target
Dependence
Command
==============================================

Target可以是文件名。Dependence可以是其它的target名或文件名。Command就是操作系统所运行的命令行。
变量
一个make规则文件有这些内容就已经基本可以工作了。可是,当在编译一个程序时,如果有些内容要反复用到,每次都要写一长串的话,是很麻烦的。于是,make就引入了宏这个概念(其实也可以看成简单的脚本语言)。
宏变量的定义如下:
var1   =   this   is   a   macro   demo!
var1
就是变量名,它的值就是“this   is   a   macro  demo!
如果我们要使用这个变量的值,那只有通过$这个运算符才行—$var1)代表的就是“this   is   a  macro   demo!”。
如下makefile
1.   var1   =   this   is   a   macro  demo!
2.   all:
3.       @echo   $(var1)
结果输出:
this   is   a   macro   demo!
用户在执行命令行时也可以定义宏变量。其形式如下:
make   all   var1=
this   is   a  test
执行结果为:
this   is   a   test
不仅可以使用自定义变量,还可以通过这种方式使用系统环境变量。这样可以大大方便使用。如下makefile
1.   all:
2.       @echo   $(WINDIR)
执行结果为:
C:\WINDOWS
(注意:makefile中的变量是大小写敏感的)

下面介绍makefile文件的一些内置变量:
==========================================
$@代表规则中的目标名(也就是规则名)。
$<代表规则中的依赖项目。注意,它只代表规则所有依赖项目中的第一项!
其它还有:
$^代表规则中所有的依赖项目。
$?代表规则中时间新于目标的依赖项目。
不仅如此,还可以给这些特殊的变量加一些限制。
如:
在规则
debug/out.exe :  out.obj中,$@代表debug/out.exe,而$(@D)代表目录名debug,$(@F)代表文件名out.exe。其它如$(<D)、$(<F)、$(^D)、$(^F)、$(?D)、$(?F)与此类似。
=============================================
举个例子说明,下面是原始makefile文件内容:
==============================================
myprog : foo.o bar.o
gcc foo.o bar.o -o myprog
foo.o : foo.c foo.h bar.h
gcc -c foo.c -o foo.o
bar.o : bar.c bar.h
gcc -c bar.c -o bar.o
==============================================
用变量代替后的文件内容:
==============================================
OBJS = foo.o bar.o
CC = gcc
CFLAGS = -Wall -O -g
myprog : $(OBJS)
$(CC) $^ -o $@
foo.o : foo.c foo.h bar.h
$(CC) $(CFLAGS) -c $<-o $@
bar.o : bar.c bar.h
$(CC) $(CFLAGS) -c $<-o $@

CFLAGS用于自编译







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Makefile 是一个用于自动化编译和构建程序的工具。它可以帮助开发人员管理项目中的依赖关系和文件的编译顺序,从而提高项目的编译效率和可维护性。 学习 Makefile 可以带来以下好处: 1. 自动化编译:通过 Makefile,我们可以定义编译规则和依赖关系,使得程序的编译过程更加自动化。只需要运行 make 命令,Makefile 将会根据文件的修改时间判断哪些文件需要重新编译,从而加快程序的构建速度。 2. 管理依赖关系:Makefile 支持定义不同文件之间的依赖关系,当某个文件被修改时,只有它的依赖文件也被修改了,才需要重新编译。这种管理依赖关系的方式可以减少不必要的编译时间,提高编译效率。 3. 支持多平台:Makefile 是跨平台的,可以在不同操作系统上使用。这意味着我们可以使用相同的 Makefile 来在 Windows、Linux、macOS 等多个平台上进行程序构建,而不需要为每个平台编写不同的构建脚本。 4. 高度可定制:Makefile 的语法相对简单,但非常灵活,允许开发人员根据项目的需求自定义规则。我们可以通过定义变量、宏、规则和命令等来构建一个适合自己项目的 Makefile,满足特定的编译和构建需求。 5. 方便协作开发:在多人协作开发项目时,使用 Makefile 可以统一编译和构建的方式,避免因为不同开发环境导致的构建问题。每个开发人员只需要按照 Makefile 中定义的规则进行编译,从而保证整个项目的一致性和可靠性。 总的来说,学习 Makefile 可以帮助我们更好地管理项目的编译和构建,提高开发效率和项目的可维护性。掌握 Makefile 的基本语法和原理,能够更好地适应大型项目的开发和维护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

春阳CYang

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值