zoukankan      html  css  js  c++  java
  • 第2课

    第2课 - 初识makefile的结构

    1. makefile 的意义

      (1)makefile 用于定义源文件之间的依赖关系 (在阅读开源软件源码时,可通过Makefile掌握源码中各个文件之间的关系)

      (2)makefile 说明如何编译各个源文件并生成可执行程序  

    2. makefile 的规则

      (1)makefile 规则的定义

          形式1:targets : prerequisites command

          形式2:targets : prerequisites 

              ' '     command      

      (2)makefile 规则中各元素的含义

        targets 目标

        • 通常是需要生成的目标文件名  
        • make 所需执行的命令名称

        prerequisities 依赖        

        • 当前目标所依赖的其它目标文件

         command 命令

        • 完成目标所需要执行的命令(系统自带命令 — PATH 环境变量、用户命令 — 自己指定路径)

      (3)规则中的注意事项

        targets 可以包含多个目标

        • 使用空格对多个目标进行分隔  

        prerequisities 可以包含多个依赖          

        • 使用空格对多个依赖进行分隔

         [Tab] 键: ' '

        • 每一个命令行必须以 [Tab] 字符开始
        • [Tab] 字符告诉 make 此行是一个命令行

        续行符:  

        • 可以将内容分开写到下一行,提高程序的可读性

        makefile可以在命令前添加 @ 符号,使该命令静默执行

      (4)一个 makefile 的规则示例 

    1 all : test
    2      echo "make all"
    3 
    4 test :
    5      echo "make test"

    3. makefile依赖(prerequisites)的规则

      (1)当目标对应的文件不存在时,执行对应的命令

      (2)当依赖在时间上比项目更新时,执行对应命令

      (3)当依赖关系连续发生时,对比依赖链上的每一个目标

    4. makefile编程实验

    1 //mian.c源码
    2 
    3 int main(void)
    4 {
    5     func();
    6     return 0;
    7 }
    1 //func.c源码
    2 
    3 #include <stdio.h>
    4 
    5 void func()
    6 {
    7     printf("hello make!
    ");
    8 }
     1 #makefile源码
     2 
     3 hello.out all : main.o func.o
     4     gcc -o hello.out main.o func.o
     5 
     6 main.o : main.c
     7     gcc -o main.o -c main.c
     8 
     9 func.o : func.c
    10     gcc -o func.o -c func.c

     

      (1)工程开发中可以将 最终可执行文件名 all 同时作为makefile中第一条规则的目标。但最终可执行文件名要放在all之前,make默认使用多个目标中的首个目标。这样做的好处是当默认执行make时,make会自行判断依赖关系有没有发生更新,如果没有就不会重新编译程序。如果这里用all作为目标,由于不存在all这个文件,每次执行make时,第一条规则的命令 总会被执行,这与实际不符。如果需要强制编译该程序,执行 make all 即可。

      (2)makefile不仅可以用在C/C++中,同样可以用在其它编程语言中,如Java等。makefile只是解决问题的一种方法,但普遍应用于C/C++中。

        

    注:本文整理于《狄泰12月提升计划》课程内容

    狄泰QQ群:199546072

  • 相关阅读:
    关于Android线程间通信
    关于代码重构
    Android读书笔记01
    回忆 2012年写的
    我的笑 -- 2007年写的?
    伊人笑 2010年
    血色青春 2012年
    隔夜听雨
    错乱的爱 2010年
    【前端JS、后台C#】编码解码。
  • 原文地址:https://www.cnblogs.com/shiwenjie/p/6687162.html
Copyright © 2011-2022 走看看