zoukankan      html  css  js  c++  java
  • 实例学习写Makefile文件

    目录

      0. 扫盲
      1. 编译,链接
      2. Makefile文件执行
      3. Makefile书写规则
      4. 案例
      5. Makefile是如何工作的
      6. 拔高,参考

    0. 扫盲

    Linux 环境下的程序员如果不会使用GNU make来构建和管理自己的工程,应该不能算是一个合格的专业程序员,至少不能称得上是 Unix程序员(是不是夸张了点,别人说的)。   

    什么是makefile文件?它是一个指挥文件,指挥着源文件编译的先后顺序,以及如何链接在一起。

    1. 编译,链接

    2. Makefile文件执行

    写好Makefile(或写成makefile)文件后,直接执行命令make,编译器会自动执行makefile里的命令,进行编译、链接知道生成最终可以执行的文件。即

    make

    3. Makefile书写规则

    target : objects
        command

    其中

    • target是可以是目标文件(.o)也可以是可执行文件,还可以是个标签(最后说)
    • objects是生成target依赖的文件
    • command是make要执行的文件(可以是任意Shell命令)
    • 特殊字符:$@:目标文件,$^:所有的依赖文件,$<:第一个依赖文件

    4. 案例

    假设文件的关系如下图

    写法1

    main2 : main2.o sum.o hello.o
        g++ -o main2  main2.o sum.o hello.o
    main2.o : main2.cc sum.h
        g++ -c main2.cc
    sum.o : sum.cc sum.h hello.h
        g++ -c sum.cc
    hello.o : hello.cc hello.h
        g++ -c hello.cc

    参数 -o 后面是可执文件; -c后面是待编译的文件。在前两行中写了很多重复的.o文件,可以把它集合起来,用变量表示,如下:

    写法2

    objects = main2.o sum.o hello.o
    main2 : $(objects)
        g++ -o main2 $(objects)
    
    main2.o : main2.cc sum.h
        g++ -c main2.cc
    sum.o : sum.cc sum.h hello.h
        g++ -c sum.cc
    hello.o : hello.cc hello.h
        g++ -c hello.cc

    GUN的make相当强大,它可以自动推导文件集文件依赖关系,写法如下:

    写法3

    objects = main2.o sum.o hello.o
    main2 : $(objects)
        g++ -o main2 $(objects)
    
    main2.o : sum.h
    sum.o : sum.h hello.h
    hello.o : hello.h

    文件执行完了以后生成很多.o文件,能不能可以删除掉,可以的,写上命令(例如clean),下面是执行的操作,例如:

    写法4

    objects = main2.o sum.o hello.o
    main2 : $(objects)
        g++ -o main2 $(objects)
    
    main2.o : sum.h
    sum.o : sum.h hello.h
    hello.o : hello.h
    
    clean:
        rm *.o

    这样执行 make clean,就会执行rm *.o 删除所有的.o文件,即

    make clean

    5. Makefile如何工作的?

    1. 输入make后,会在目录找Makefile、makefile
    2. 如果找到,它会在文件中找到第一个目标文件(例子中的main2)作为最终的目标文件
    3. 如果main2不存在,就依靠后边的.o文件生成
    4. 如果后边的.o不存在,就利用下边的g++ -c 生成
    5. .o文件都够了,就链接生成最终的目标文件

    6. 拔高,参考

    跟我一起写Makefile-陈皓

  • 相关阅读:
    POJ1113:Wall (凸包:求最小的多边形,到所有点的距离大于大于L)
    POJ3304:Segments (几何:求一条直线与已知线段都有交点)
    【几何】简单积累
    POJ2689:Prime Distance(大数区间素数筛)
    POJ2142:The Balance (欧几里得+不等式)
    初探云原生应用管理(二): 为什么你必须尽快转向 Helm v3
    初探云原生应用管理(一): Helm 与 App Hub
    AI种黄桃AI卖黄桃 阿里巴巴推进一站式政务服务
    MongoDB sharding 集合不分片性能更高?
    阿里云发布敏感数据保护产品SDDP,数据贴身防护实现“外防内控”
  • 原文地址:https://www.cnblogs.com/kaituorensheng/p/3667634.html
Copyright © 2011-2022 走看看