从零开始学习音视频编程技术(33) Linux篇之Makefile
时间:2017年06月07日 人气:...



    回想上节我们写的main.c和function.c,编译这2个文件的时候我们用了3条命令,分别是:

gcc  -c  main.c

gcc  -c  function.c

gcc  -o  hello  main.o function.o


写代码可是一个不断修改,不断编译的过程,毕竟让编译器帮我们找语法上的错误要迅速的多。

因此编译的命令需要非常频繁的输入,这里如此简单的程序就用到了三条命令,那要是更复杂的呢?  即便是只有3条命令,每次编译都要输入一次也是没办法接受的(会让我直接放弃写代码)。


好在有一种东西叫做Makefile。



Makefile 介绍

    什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。因为,makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。

        只要我们的Makefile写得够好,所有的这一切,我们只用一个make命令就可以完成,make命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自己编译所需要的文件和链接目标程序。



Makefile 书写规则如下:

 

总目标:依赖1依赖2...

目标1:依赖

<tab>命令

目标2:依赖

<tab>命令

 

简单举个例子:

######## makefile #######

helloworld:hello.o main.o

       gcc -o helloworld hello.o main.o

hello.o:hello.c

       gcc -c hello.c

main.o: main.c

       gcc -c main.c

 


理论知识以及掌握了,现在着手写一个Makefile吧,就以上一节的代码为例来编写。

上一节中,编译用的命令为:

gcc  -c  main.c

gcc  -c  function.c

gcc  -o  hello  main.o function.o


简单的说,就是把main.c和function.c编译成hello文件。

写成Makefile就是:

hello:main.o function.o

gcc -o hello main.o function.o


main.o:

gcc -c main.c


function.o:

gcc -c function.c




打开终端,切到main.c和function.c所在的目录(这两个文件没有的,请查看上节教程)

执行如下命令,新建一个Makefile文件:

gedit Makefile

将上面的内容复制到Makefile里面保存,

回到命令行,输入命令:

make

按下回车,会看到终端上打印了3条命令,和手动输入3条命令是一样的效果。

执行完毕,将会看到桌面上出现了hello文件,运行hello:


可以看到,程序已经成功编译,并且可以运行了,以后修改了代码只需要在终端输入make命令就可以编译了,省了不少功夫吧。


至此Makefile顺利完成了,当然这只是一个非常简单的例子,Makefile是非常复杂的,更多的功能请自行百度。

古语有云:“师傅领进门,修行看个人”。 我只是负责领路,剩下的还得靠自己。


学习音视频技术欢迎访问 http://blog.yundiantech.com  

音视频技术交流讨论欢迎加 QQ群 121376426