Linux之Makefile

本文详细介绍Makefile文件的编写方法及技巧,包括依赖关系定义、规则设置等,旨在提高大型项目的编译效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     》    学会编写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.o
main.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 移除目标文件









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值