tiny6410裸机实验第1章--------------ARM汇编和编程基础(Makefile 简介)

来源:互联网 发布:mac chrome f12 编辑:程序博客网 时间:2024/05/16 19:27

【说明】

               我们在windows下写程序一般用集成开发环境,比如VC6,vs2010等等,当我们写完程序时,只需要点击编译且执行的按钮,结果就会出来了。。但是其实编译的过程没这么简单,只是集成开发环境帮我们都做好了,我们看不到。但是在linux上用GCC编译的时候,我们一般都会写一个或者多个makefile(因为makefile 可以相互调用) ,用来指示整个编译过程的进行。如果一个工程中有一个优秀的makefile 那我们编译就不需要自己敲GCC命令,而是直接执行make命令

 

【最简单的makefile】

                就拿上次那个test.c为例子,由于只有一个文件,所以makefile 十分简单

              

              整个工程文件如下

             

              我们想编译test.c 只要直接敲命令 make

              

              上边那个clean 是干嘛的?看了下边你就知道

 

【Makefile 规则】

               一个简单的makefile 规则是这样的:

               目标(target)...:依赖(prerequiries)...

               <tab>命令(command)

               当依赖比目标更加新,也就是依赖是最近刚修改过的,那么下面的命令就会被执行(命令前面一定要是tab键,不能包含其他任何东西),比如上边的例子,当test.c比test更加新的时候,下面的GCC命令就会被执行。

               命令只能是一条?NO,可以是任何shell脚本,但是每一条都要以tab开头啊。

               那那个clean 是干啥?显然clean 是目标,但是他没有依赖,所以他不会自动执行,下边的命令是删除test的意思。如何执行clean?其实,我们执行make的时候,他会从makefile 中找第一个目标执行,注意,不是从这里一直执行下去,而是只执行这个目标,如果我们需要执行指定的目标,就比如这个clean ,我们可以如下操作

             

              我们再来看一个例子,假设我有源文件A.c    B.c ,要编译成可执行文件test,如何写makefile

               

              我想大家一看就知道。。make首先找到第一个目标test,发现2个依赖,就在下边找以每个依赖为目标的规则,发现了下边的目标A.o 且没有 A.c目标,那么认为 A.c是文件,然后发现A.c比A.o要新,就执行A.o目标的对应命令 gcc -c A.c -o A.o 这样就生成了A.o,以同样的方法生成B.o  发现这两个有一个或以上要比test目标新,那么就执行test目标下的命令 gcc A.o B.o -o test ,这样test就编译好了

             可能你会说,为什么要使用 makefile  就这么几个文件我自己敲命令啊!当然你可以自己敲命令,那如果你的工程里有十几,几十,几百,乃至上万个源文件呢,你每编译一次就从头敲一次?另外,如果几百个文件,我只改了其中一个。。难道所有源文件都要重新编译?这样显然浪费时间,所以聪明的黑客们发明了makefile ,用这样的依赖关系,make命令就会自动得只把需要的部分重新编译。

 

 

【Makefile 变量与赋值】

             上边的A.o和 B.o我们在每一处都要敲,其实可以用变量去代替,比如

            

            我想就不需要太多解释了。。。。。obj是个变量,用 $(obj)来引用他。这样的好处不仅仅是省得到处敲,而且如果你想再加入一个新的依赖,,只要改动obj就行了

            更简单的做法可以是!

           

            为什么没有A.o的生成规则也行呢,因为make比较聪明,每当他发现一个A.o他就会自动建立一个和我们上边一样的规则来生成A.o

 

【深入学习】

              完整的 makefile 知识其实还挺复杂的,但是对于我们初学者,用不到那么复杂,先学习简单的开始。要想完整系统得学习makefile(其实以后也必须学)这篇文章值得推荐(如果你有耐心看完的话)http://blog.csdn.net/linux_for_you/article/details/19520483

0 0
原创粉丝点击