Linux之Makefile

来源:互联网 发布:115个java面试题和答案 编辑:程序博客网 时间:2024/04/29 10:10

     》    学会编写Makefile文件是完成大型项目的基础,一个大型工程里的源文件不计其数,按类型,功能,模块分别放在若干个目录中,makefile定义了一系列规则指定那些文件需要先编译,哪些需要后编译等等.....甚至于更复杂的功能操作。makefile就像一个shell脚本一样,其中也可以执行操作系统的命令。makefile带来的好处就是--------“自动化编译”,一旦写好这个文件,只需要一个make命令,整个工程完全自动编译,极大地提高了软件开发的效率。

    》 make是一个命令工具,是一个解释makefile文件中指令的命令工具。它可以在必要时重新编译所有受影响的源文件。

     》 makefile文件的语法

     $  makefile文件由一组依赖关系和规则构成。每个依赖关系由一个目标(即将要创建的文件)和一组该目标所依赖的源文件组成。而规则描述了如何通过这些依赖文件创建目标。一般来说,目标是一个单独的可执行文件。

    $   make命令会读取makefile文件的内容,它先确定要创建的目标文件,然后比较该目标所依赖的源文件到日期和时间,以决定该采用哪条规则来构造目标。通常在创建最终的目标文件之前,需要先创建一些中间目标。make命令会根据makefile文件来确定目标文件的创建顺序以及正确的规则调用顺序。


    》make命令的选项和参数

       make命令本身有许多选项,其中最常用的三个选项是:

  • -k:它的作用是让make命令在发现错误时仍然继续执行,而不是在检测到第一个错误时就停下来。我们利用这个选项在一次操作中发现为编译成功的源文件。
  • -n:它的作用是让make命令输出将要执行的操作步骤,而不真正执行这些操作。
  • -f filename:它的作用是告诉make命令将哪个文件作为makefile文件。如果未使用这个选项,make命令将首先查找当前目录下名为makefile的文件,如果该文件不存在,就会查找名为Makefile的文件。
       为了指示make命令创建一个特定的目标(通常是一个可执行文件),我们可以把该目标的名字作为make命令的一个参数。否则,make命令将试图创建列在makefile文件中的第一个目标。许多程序员都会在自己的makefile文件中将第一个目标定义为all,然后再列出其他的从属目标。这样就可以明确地告诉make命令,再未指定特定目标时,默认情况下应该创建哪个目标。
      》依赖关系:例如有一个main.c   main.h文件,则main.o依赖于main.c和main.h,如果这两个文件任一有变化,就需要重新编译来生成main.o文件。
          makefile文件的编写规则是:先写目标文件后接一个冒号然后用一个空格或者tab隔开最后是用空格或者tab隔开的文件列表(依赖的文件,用于创建目标文件)   
<span style="font-size:18px;"> mymain:main.o main.o:main.c main.h</span>
   如上,mymain文件生成依赖main.o, main.o文件生成依赖main.c和main.h。
   如果我们想一次性生成多个文件,就可以利用名义上的目标all
<span style="font-size:18px;">all:myapp myapp.1</span>
 如果make未找到制定目标all则只创建makefile文件里的第一个目标。
  》规则:makefile文件里的第二类内容就是规则,规则定义了目标的创建方式,如下图:
<span style="font-size:18px;">mymain:main.o    gcc -o mymain main.omain.o:main.c main.h    gcc -c  main.c       </span>
      也许有些同学理解不了gcc后面的参数,那么这里说一下文件的生成方式:例如有一个test.c文件,那么它运行的过程是什么呢?
      预处理:test.c  ----test.i       gcc --E (大写)
      编译:   test.i    ----test.s      gcc -S(大写)
      汇编:   test.s   ----test.o      gcc -c         
      链接:   test.o  ---- test         gcc -o
      上面就是文件的依赖关系,实质就相当于文件的逆生长。然后   make -f  makefile   就可以生成我们想要的目标文件mymain。make命令处理makefile文件中的依赖关系,确定需要创建的文件以及创建顺序。虽然我们把目标mymain列在最前面,但make命令能够自行判断出创建文件的正确顺序。它调用在规则部分给出的命令以创建相应的文件,同时会在执行时在屏幕上将命令显示出来。
      
<span style="font-size:18px;">mymain:main.c     gcc -o mymain main.c:PHONY:clean</span>
<span style="font-size:18px;"> clean:     rm -f mymain</span>
   上面这种写法mymain直接依赖main.c,生成一个伪目标,移除目标文件。
   命令模式下make 一下生成目标文件mymain,make clean 移除目标文件









0 0
原创粉丝点击