【Linux】make和makefile详解

在linux系统上编译大一点的项目时,会用到make/makefile文件
1.make与makefile
利用make工具,我们可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序,使用make和makefile工具就可以简洁明快地理顺各个源文件之间纷繁复杂的相互关系。 而且如此多的源文件,如果每次都要键入gcc命令进行编译的话,那对程序员来说简直就是一场灾难。 而make工具则可自动完成编译工作,并且可以只对程序员在上次编译后修改过的部分进行编译。 因此,有效的利用make和makefile工具可以大大提高项目开发的效率。

make工具功能

利用make工具可以自动完成编译工作,这些工作包括:

如果修改了某几个源文件,则只重新编译这几个源文件
如果某个头文件被修改了,则重新编译所有包含该头文件的源文件
利用这种自动编译可以大大简化开发工作,避免不必要的重新编译。make工具通过一个称为Makefile的文件来完成并自动维护编译工作,Makefile文件描述了整个工程的编译、连接规则。

makefile工具功能

Makefile描述了整个工程的编译连接规则。makefile表明了目标文件和源文件的依赖关系和依赖方法
举个简单的例子:

 在一个目录下创建一个源文件,创建一个makefile文件,makefile文件中添加目标文件与源文件依赖关系和依赖方法:

    依赖关系:  目标文件:mycode  依赖  源文件:test.c 

    依赖方法:gcc test.c -o mycode

 使用make命令,生成了目标文件mycode   ./mycode 运行可执行程序 就打印出了运行结果。这就是make与makefile的简单使用。这里是项目的生成,下面加入工程的清理:

当我们不需要生成的可执行程序文件时,使用 make clean 命令就可以完成对文件的清理工作

 有细心的小伙伴发现我们在使用make命令编译时什么都不加但是为什么清理时就需要加

make clean 那是因为make在执行makefile文件里的内容时,从上往下执行,第一个依赖关系和依赖方法执行完之后就停止了,第一个make mycode 的mycode可以省略 ,但是第二个起就不能省略了,只能完整的使用 如:make clean 

连续的编译一个文件会提示xxxx is up to date   说明不能连续的编译但是连续的make clean 

却不会报错:

原因是在makefile:中在clean 前加了一个 .PHONY  这个指令代表这一指令总是被执行,所以连续执行clean不会提示。不能连续编译,是编译器的一种只能检查的表现,源文件在没有改变的情况下就没必要进行再编译,我的的小程序没有多大的影响,对于一个大项目来说重新编译会浪费时间也没有必要。

这就又引出了一个问题,编译器是怎么识别这个程序需不需要重新编译?

每一个文件都有文件属性:

每个文件都有三个时间:

1.Access:访问文件的时间

 2.Modify:修改文件内容的时间

3.Change:修改文件属性的时间

每次访问文件不一定修改Access的时间,因为访问文件的次数是很多的,但是这个时间也没必要每一次访问都修改,对于系统来说是一个很大的工程,访问文件的时间也没有那么重要,所以可能多次访问改变一次文件的 Access的时间。文件的大小改变那Modify的时间就会改变,文件的大小是文件的属性所以Change的时间一定会改变。Change的时间会随着用户chmod 手动改变文件的属性而改变。touch  xxx  可以更新xxx文件的三个属性。

源文件的Modify 没有改变,在编译好的情况下,就没有必要进行再编译,所以编译器只用比较

源文件的Modify和目标文件的Modify时间,判断需不需要重新编译。若源文件的Modify 时间新则可以进行再编译,反之,不编译。加了.PHONY系统就不会根据自己的判断去决定指令该不该执行,而是总是执行指令。

  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
Make命令   在make命令后不仅可以出现宏定义,还可以跟其他命令行参数,这些参数指定了需要编译的目标文件。其标准形式为:   target1 [target2 …]:[:][dependent1 …][;commands][#…]   [(tab) commands][#…]   方括号中间的部分表示可选项。Targets和dependents当中可以包含字符、数字、句点和"/"符号。除了引用,commands中不能含有"#",也不允许换行。   在通常的情况下命令行参数中只含有一个冒号":",此时command序列通常和makefile文件中某些定义文件间依赖关系的描述行有关。如果与目标相关连的那些描述行指定了相关的command序列,那么就执行这些相关的command命令,即使在分号和(tab)后面的aommand字段甚至有可能是NULL。如果那些与目标相关连的行没有指定command,那么将调用系统默认的目标文件生成规则。   如果命令行参数中含有两个冒号"::",则此时的command序列也许会和makefile中所有描述文件依赖关系的行有关。此时将执行那些与目标相关连的描述行所指向的相关命令。同时还将执行build-in规则。   如果在执行command命令时返回了一个非"0"的出错信号,例如makefile文件中出现了错误的目标文件名或者出现了以连字符打头的命令字符串,make操作一般会就此终止,但如果make后带有"-i"参数,则make将忽略此类出错信号。   Make命本身可带有四种参数:标志、宏定义、描述文件名和目标文件名。其标准形式为:   Make [flags] [macro definitions] [targets]   Unix系统下标志位flags选项及其含义为:   -f file  指定file文件为描述文件,如果file参数为"-"符,那么描述文件指向标准输入。如果没有"-f"参数,则系统将默认当前目录下名为makefile或者名为Makefile的文件为描述文件。在linux中, GNU make 工具在当前工作目录中按照GNUmakefilemakefileMakefile的顺序搜索 makefile文件。   -i   忽略命令执行返回的出错信息。   -s   沉默模式,在执行之前不输出相应的命令行信息。   -r   禁止使用build-in规则。   -n   非执行模式,输出所有执行命令,但并不执行。   -t   更新目标文件。   -q   make操作将根据目标文件是否已经更新返回"0"或非"0"的状态信息。   -p   输出所有宏定义和目标文件描述。   -d   Debug模式,输出有关文件和检测时间的详细信息。   linuxmake标志位的常用选项与Unix系统中稍有不同,下面我们只列出了不同部分:   -c dir   在读取 makefile 之前改变到指定的目录dir。   -I dir   当包含其他 makefile文件时,利用该选项指定搜索目录。   -h   help文挡,显示所有的make选项。   -w   在处理 makefile 之前和之后,都显示工作目录。   通过命令行参数中的target ,可指定make要编译的目标,并且允许同时定义编译多个目标,操作时按照从左向右的顺序依次编译target选项中指定的目标文件。如果命令行中没有指定目标,则系统默认target指向描述文件中第一个目标文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

bite-ccc

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

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

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

打赏作者

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

抵扣说明:

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

余额充值