linux中的‘make’和‘makefile’

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux中的‘make’和‘makefile’相关的知识,希望对你有一定的参考价值。

       在提及‘make’和‘makefile’之前有必要先理清楚程序编译的过程,在windows操作系统下,我们一般使用的编写程序的软件有vs、vc等,这些都是集成软件,当编写完程序之后,直接点击进行编译和链接,那么编译器是怎样将程序进行编译的呢?


◆编译过程

(1)预处理阶段

         将程序编辑完成之后,在编译之前,编译器会先对程序进行一下预处理,预处理阶段一般的工作是将程序的注释去掉,将头文件在源文件之中进行展开,同时进行宏替换等操作,经过处理之后就会生成一个.i文件。

(2)编译阶段

        将编译的源程序转换为汇编代码,生成.s文件。

(3)汇编阶段

        将汇编文件.s转换为计算机能够识别的二进制文件.o文件。

(4)链接阶段

        将引用其他的.o文件和二进制文件链接到一块,形成二进制文件.exe。


        windows上面的编译环境都是集成化的,程序员可以不用过于在于程序执行的过程,但是在liunx系统中编辑器、编译器、调试器都是分隔开的,我这里使用的编辑器是vim,编译器是gcc,调试器为gdb,这里需要澄清一下make和makefile(也可以为Makefile)的区别?

        make和makefile是两个完全不一样的东西,make是一条指令,能够进行程序的编译,而makefile是一个文件,一般可以使用gcc指令进行编译生成许多的目标文件,makefile文件中都是一些编译的指令,当makefile文件写好之后,只需要使用make指令就能够完成编译过程,下面以一个简单的程序介绍一下linux中程序的执行过程:


■编写main.c文件

技术分享

■编写test.c文件

技术分享

■编写test.h文件

技术分享

        显而易见,如果想要执行main.c文件就离不开这三个文件,那这三个文件之间存在什么样的关系呢?想要执行程序就需要有main.o、test.o文件,而test.o和main.o文件就需要有test.s和main.s文件,同时main.s和test.s文件又依赖于main.i和test.i文件,而这两个文件又依赖于main.c和test.c文件,编译过程中产生的文件之间都存在这依赖关系,即就是编译的逆过程,下面进行简单的图示:


技术分享


◆下面是简写的makefile文件:


技术分享


        根据上面的makefile文件,简单的介绍一下makefile文件的执行过程,makefile文件是顺序执行的,执行过程中会按照指令生成对应的目标文件,clean是一个动作的名字,当输入make进行编译时,不会执行clean的内容,如果输入命令make clean的指令,然后就直接跳到clean位置执行clean的内容,将刚才编译时产生的目标文件进行删除,下面是程序执行的过程:


技术分享

技术分享


注意: 

(1) 如果不想变异的过程中,将执行的编译指令输出,可以在makefile文件中的编译指令前进行添加@字符,即就是@gcc -c test.c    ,这样执行的指令就会被隐藏。


(2)makefile中使用的注释符号为‘#’。


(3)clean只是一个动作的名字,它是没有依赖关系的,所以clean的后面只有‘:’,没有其他的文件之类的东西。






本文出自 “无心的执着” 博客,转载请与作者联系!

以上是关于linux中的‘make’和‘makefile’的主要内容,如果未能解决你的问题,请参考以下文章

Linux之Makefile

Linux中make

linux里面的make和makefile是做啥的?

Linux操作系统自动化编译make和Makefile

linux 中make命令出错是怎么回事了

linux下make以及makefile