Makefile文件编写详解

         在Linux下编写小程序时,相信大家都知道怎么做,直接编辑源文件(一般是.c和.cpp),然后采用gcc/g++来编译源文件,生成执行文件,这样一个简单的应用程序就可以编写完成。但是如果对于一个复杂应用程序的时候(包含很多源文件和头文件),如果继续采用“编辑-编译-测试”的方式,则需要操作很多次,且只要其中某一个文件改动,其关联到的文件都要重新编译生成。因此,如果继续采用单步编译的方式,则会浪费很多时间且有时候造成混乱(文件太多,不知道哪些被改动,哪些没有,特别是同一个项目由不同的人来维护的时候,问题更为突出)。那么怎么样才能做到高效的吧编写复杂应用程序呢? 这就需要用到makefile文件了和make命令了。

       makefile文件主要由一组依赖关系和规则构成。每个依赖关系由一个目标(即要创建的文件:可执行文件或库文件)和一组该目标所依赖的源文件组成,规则描述了如何通过这些依赖文件创建目标。下面以一个具体例子来分析,应用程序由以下几个文件组成:

          main.c (输入两个数,打印加减乘除结果)、add_test.c(实现加法操作)、 sub_test.c(实现减法操作)、multiply_test.c (实现乘法操作)、div_test.c(实现除法操作) 和 Compro.h(定义加减乘除函数)。(代码这里就不贴了,因为不是重点)。

         我们假定要生成的可执行文件即目标文件为:myapp

  则makefile文件编写如下:

 

        红框表示的为依赖关系,即生成的目标文件(:左边文件)依赖的文件(:右边文件)。而蓝框表示的规则,即怎么生成目标文件。这里主要采用的gcc编译器。

       编写好makefile文件后,就可以通过make命令来执行makefile文件了,直接在上上述所在文件的目录下执行make命令即可,当然如果你不是以makefile命名的话,比如你以aaa (当然这种命名方式也很差劲饿)命名,则可以执行 make -f aaa命令。这里建议大家最好是采用Makefile命名方式(这种命名方式是可以直接在所在文件目录下找到Makefile文件,因为源文件和头文件都是以小写字母命名的)。执行完make命令后,看看生成的文件:

    

 myapp就是最终生成的程序可执行文件了,现在执行./myapp来运行下程序:

  

到这里基本makefile文件即make操作就介绍完了,不过大家有没有发现一个问题,虽然这个文件包含的源文件还不算少,但是源文件都是放在一块的。特别是,c和.h文件放在一起,而一般中大型项目都包含很多模块,并且.h和.c文件都是分别放在src和include目录下,因此上面的程序还是没有涉及到把源文件分类和把中大型模块化,而只是吧源文件放置在同一目录下,这样结构极不清晰,也不方便维护。下面讨论下怎么实现模块化的makefile文件编写:

   针对上面的应用程序,可以将.c文件存放在/src目录下,.h文件存放在/include目录下,然后在/目录下编写makefile文件,具体实现如下:

       

其中 (1):红框为定义的宏。

          (2):蓝框表示的生成中间文件.o的部分,这里涉及到一些foreach函数,一些特许宏的定义比如 $< $@等

其中:foreach函数,$(foreach,<var>,<list>,<text>),表示把参数<list>中的单词逐一取出放到参数<var>所指定的变量中,然后再执行<text>所包含的表达式。每次<text>会返回一个字符串,最后当整个循环结束时,<text>所返回的每个字符串所组成的整个字符串(以空格分隔),将会是foreach函数的返回值。

           $< 表示当前依赖文件的名字 ,$@ 表示当前目标文件名字。

           $(SRC_DIR)/%.o 表示$(SRC_DIR)目录下即.c文件所在目录/src下,所有.o目标文件,$(SRC_DIR)/%.c 即/src目录下所有.c文件,其中.o和.c文件是一一对应的。

           (3):黑框表示的最终生成的可执行文件也就是$(TARGET) = compro_test了。

到此,makefile基本讲完。

 

 

    

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值