make/Makefile【Linux系统编程】

一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作


makefile带来的好处就是——自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。


make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。


make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

注意:Makefile是一个文件,在当前目录下。

make/Makefile【Linux系统编程】_第1张图片

 第1行:表示依赖关系,mycode.c生成目标文件mycode

 第2行:表示依赖方法,通过gcc编译。

make/Makefile【Linux系统编程】_第2张图片

用make指令就可以执行我们在Makefile里写的方法。 

怎么清理调生成的可执行程序 mycode

make/Makefile【Linux系统编程】_第3张图片

注意:前面是table键,不是四个空格。

make会自顶向下扫描目标文件,把要形成的第一个目标文件充当make的默认动作。

因此建议把要形成的可执行程序放在前面。

make/Makefile【Linux系统编程】_第4张图片

make/Makefile【Linux系统编程】_第5张图片  

 被编译过的文件,如果代码没有更新,是无法再make的

why?

没必要,浪费时间。

how?

.exe新于.c ,源文件是老的,不需要编译。

.exe老于.c , 源文件是新的,需要编译。

make/Makefile【Linux系统编程】_第6张图片

 Access:最近访问时间(因为改变太快,所以实际上并不会每次都更新)。

Modify\Change:

make/Makefile【Linux系统编程】_第7张图片

有了时间,就可以转时间戳进行比较文件新旧。

make 不一定每次都执行,那我一定要执行呢?

make/Makefile【Linux系统编程】_第8张图片

 .PHONY:伪目标

mycode对应的依赖关系总是被执行。

建议给clean加上.PHONY

make/Makefile【Linux系统编程】_第9张图片

 make/Makefile【Linux系统编程】_第10张图片

 可以用$@ $^代表mycode 和 mycode.c

make/Makefile【Linux系统编程】_第11张图片

 不想回显,就加@

make/Makefile【Linux系统编程】_第12张图片

补充:

  • 编译过程为 扫描程序-->语法分析-->语义分析-->源代码优化-->代码生成器-->目标代码优化;
  • 扫描程序进行词法分析,从左向右,从上往下扫描源程序字符,识别出各个单词,确定单词类型
  • 语法分析是根据语法规则,将输入的语句构建出分析树,或者语法树,也就是我们答案中提到的分析树parse tree或者语法树syntax tree
  • 语义分析是根据上下文分析函数返回值类型是否对应这种语义检测,可以理解语法分析就是描述一个句子主宾谓是否符合规则,而语义用于检测句子的意思是否是正确的
  • 目标代码生成指的是,把中间代码变换成为特定机器上的低级语言代码。

 makefile中的伪对象表示对象名称并不代表真正的文件名,与实际存在的同名文件没有相互关系,因此伪对象不管同名目标文件是否存在都会执行对应的生成指令。伪对象的作用有两个,1. 使目标对象无论如何都要重新生成。2. 并不生成目标文件,而是为了执行一些指令。

死代码删除是编译最优化技术,指的是移除根本执行不到的代码,或者对程序运行结果没有影响的代码,而并不是删除被注释的代码

强度削弱是指执行时间较短的指令等价的替代执行时间较长的指令,比如 num % 128 与 num & 127 相较,则明显&127更加轻量

你可能感兴趣的:(Linux系统编程,linux,运维,服务器)