Makefile的通用模板解析

            介于许多童鞋不会使用Makefile来管理我们的代码文件,有时候工程文件少的时候通过gcc直接编译是比较方便的,但是当我们一个项目中的工程文件比较多难以管理的时候再去使用gcc去逐个地编译源文件那是比较麻烦的,可能刚开始写Makefile的时候花费一些时间但是一旦我们的Makefile写好之后,以后每次修改好代码之后一条make即可完成所有的编译工作。

        对于简单实用Makefile的编写也不是那么复杂,使用Makefile的好处是他可以根据文件修改的时间戳去只编译被修改过的文件,编译的效率会提高很多。本文中主要通过实例来说明简单的Makefile如何编写?如何编写针对于多个文件最终链接一个文件?和多个文件如何编译生成对应的可执行文件?当然一些的实例Makefile可以作为模板来使用,只需要改动几个参数就能成为自己的Makefile。需要说明的是:本文所编写的Makefile是针对于应用层软件管理的,不适用于像内核模块的编译,对于内核模块的编译和应用层的编译还是不一样的,关于内核驱动模块的编译的相关内容见Linux设备驱动程序相关的内容。

        Makeflie的三要素是:目标、依赖和规则。只要把握住这三要素就能掌握Makefile的编写方法。以下分别从多文件编译生成一个可执行文件和多文件编译生成多个可执行文件实例化讲述。

一、多文件编译生成一个可执行文件

         首先,我们创建多个工程文件(主要功能很简单:就是完成加法和减法操作)如下图:

                    

         各个文件内容如下:add.c和sub.c分别是实现加法和减法的功能文件,main.c是软件的入口用于调用这些功能函数,add.h和sub.h 是函数声明的头文件。

                     Makefile的通用模板解析_第1张图片

                                                                         图1    add.c文件 


                    Makefile的通用模板解析_第2张图片

                                                                      图2   add.h文件


                    Makefile的通用模板解析_第3张图片

                                                                     图3  sub.c文件


                    Makefile的通用模板解析_第4张图片

                                                                    图4  sub.h文件


                    Makefile的通用模板解析_第5张图片

                                                                图5  main.c文件

       编写好了这些文件之后,我们要搞清楚哪些文件是依赖文件?要生成哪些目标文件?不难看出:要生成最终的main这个可执行文件需要有add.o  sub.o main.o这些中间文件作为依赖文件,而各自的*.o文件需要各自的*.c文件作为各自的依赖。于是我们编写了如下的Makefile (嘿嘿,可算见到它的真面目了!)

                     

        咋的一看挺复杂的,其实没什么,就那么几行。我给大家稍微解释一下大家就知道了:前4行都是我们定义的一些变量(shell中的自定义变量),第一行用 CC 这个变量代替我们通常使用的 gcc ,第二行是gcc的几个编译的选项,当然不加也不会编译报错,但是还是加上的好,因为-Wall表示打印所有的类型的语法警告(例如:变量定义了但没有使用),-g是生成能够用于gdb调试的代码,-O2是对代码做一些相对深度的优化工作。第三行和四行分别是定义我们最重要生成的可执行文件和中间的目标文件。第五行和第六行就是Makefile 的三要素了:目标、依赖和规则。这是固定的书写格式,冒号‘:’的左边为目标文件,右边为依赖文件,且规则之前必要要有tab键,规则中的变量前加$是取出变量的值(即是之前定义的),$^和$@是Makefile的自动变量(当然还有其他的自动变量,只是这俩最常用),$^表示所有的依赖文件,$@表示目标文件 。第七八行也类似只不过是利用了Makefile的自动编译规则,所有的*.o由对应的*.c文件生成,没有这两行也是可以的,在找*.o文件的时候会自动使用对应的*.c文件来生成。第10和11行是声明一个伪目标,顾名思义,并不是真正的目标因为其没有依赖文件,只有规则即是13行的规则(删除所生成的文件最终文件和中间文件的规则)。说到这里大家一定掌握了这种makefile的编写方法,说好了可以作为万能模板的,可是怎样修改呢?非常简单,只需要对3和4行修改即可,第3行修改为你想要生成的最终可执行文件,第4行修改为中间用于链接的目标文件(即是对应文件的*.o文件)。

        回到Makefile所在的目录,执行make : 有编译过程的打印信息,可见生成了中间的*.o文件和最终的main可执行文件。

Makefile的通用模板解析_第6张图片

          执行make clean命令:执行删除规则,查看那些文件已经被删除了。

Makefile的通用模板解析_第7张图片

            

二、多文件编译生成多个可执行文件 

         有了上面的介绍,这种Makefile就很好理解了,以下只给出Makefile文件:

Makefile的通用模板解析_第8张图片

       我们注意到这个Makefile和上面的有些差别就是5行,这是必须要有的。因为如果没有这一行,只会生成add这个最近的这个目标,下面的其他目标都不会生成。写这一行的目的是要通过add和sub这两个依赖生成all这个终极目标,但是没有规则,就不会生成all目标,只会按照规则分别寻找add和sub的生成规则,于是就完成了多个文件生成多个对应的可执行文件的目的。关于修改成通用的Makefile只需要修改对应的文件即可。

三、总结

       以上就是我平时使用最多的两种类型的Makefile的编写,看到这里大家有没有发现Makefile的编写并不是那么难只要掌握规律,都可以修改作为模板来用。当然,Makefile的语法远不止这些,但是这些我们已经可以做一些简单的工程管理了,对于平常的应用层编写也是够用,对于不足之处望给予宝贵意见。

         



你可能感兴趣的:(Linux系统)