1

make与Makefile

多个文件编译,需要提供一个makefile文件用它来一层层的自动化编译目标文件

makefile
  • 整个的编写流程应该如下:
    all:main
    main(目标文件): x.o b.o(依赖文件)
    (TAB)gcc -o main x.o b.o(命令)
    x.o: x.c
    (TAB)gcc -c x.c
    b.o: b.c
    (TAB)gcc -c b.c
    ...
    ...
  • 另外如果存在一行写不完需要中途换行的情况下,那就需要使用 / 进行换行
    例如说:
    main: a.o b.o c.o d.o e.o /
    f.o h.o i.o
  • 除了all之外,makefile同样可以指定目标,即如下:
    clean:
    rm -f *.o
    这是我们常用的一种目标方式,当工作目录没有clean这个文件时候,make clean就会执行删除命令
  • 那么如果我们需要在即使是有clean文件的情况下依然执行make clean,则我们需要加入伪目标,将clean声明为伪目标之后,不论存不存在clean文件,都能正常的是执行删除,语法如下:
    .PHONY:clean
    clean:
    rm -f *.o
  • 如果想为Makefile提供输出提示,那么可以:
    @echo 正在编译xxxx模块
    如果不加@那么echo会被显示,就类似于Windows批处理的输出,@意思是隐藏回显
  • 如果想要Make去执行多个脚本命令,那么需要在命令之间以分号隔开:
    test:
    cd ./test/; pwd
  • 如果需要忽略makefile中的错误命令信息,那么可以在相关命令上加入‘-’或者指定make的-i参数
    make -i
    或者
    test:
    -cd ./test/
  • makefile同样可以加入条件语句
    ifeq($1, $2)
    else
    endif
    或者
    (if <condition>,<then-part>)
    (if <condition>,<then-part>,<else-part>)
  • makefile可以加入路径的设置 VPATH
    VPATH <directories> :: 当前目录中找不到文件时, 就从<directories>中搜索
    VPATH <pattern> <directories> :: 符合<pattern>格式的文件, 就从<directories>中搜索
    VPATH <pattern> :: 清除符合<pattern>格式的文件搜索路径
    VPATH :: 清除所有已经设置好的文件路径
  • makefile中的定义变量和使用
    variable = %.h
    all: $(variable)
Make的运行
  • 那么当我们执行make时候,make的运行过程是怎么样的呢?
    1. make在当前目录下依次搜索下面3个文件 "GNUmakefile", "makefile", "Makefile"(推荐使用Makefile)
    2. 以第一个目标文件为终极目标,开始进行推导,如果说没有这个文件,或者目标依赖文件改动时间比目标文件生成时间新,那么就会对相关项进行新的生成;
    3. 如果依赖文件也不存在,那么make会查找makefile文件中以缺失的依赖文件为目标的相关项进行生成
  • 查看文件的依赖关系,gcc 所使用的命令,可以查看后直接放入makefile作为目标用

    gcc -MM kvm_main.c

  • make可以增加的参数
    --debug[=<options>] 输出make的调试信息, options 可以是 a, b, v
    -j --jos 同时运行的命令的个数, 也就是多线程执行 Makefile
    -r --no-builtin-rules 禁止使用任何隐含规则
    -R --no-builtin-variabes 禁止使用任何作用于变量上的隐含规则
    -B --always-make 假设所有目标都有更新, 即强制重编译
    -i --ignore-error 忽略命令的错误返回
  • 命令变量
    RM rm -f
    AR ar
    CC cc
    CXX g++
  • 约定俗称的伪目标
    all 所有目标的目标,其功能一般是编译所有的目标
    clean 删除所有被make创建的文件
    install 安装已编译好的程序,其实就是把目标可执行文件拷贝到指定的目录中去
    print 列出改变过的源文件
    tar 把源程序打包备份. 也就是一个tar文件
    dist 创建一个压缩文件, 一般是把tar文件压成Z文件. 或是gz文件
    TAGS 更新所有的目标, 以备完整地重编译使用
    check 或 test 一般用来测试makefile的流程

资料参考:
https://www.cnblogs.com/mfryf...
https://www.cnblogs.com/wang_...


且行且歌_C
62 声望8 粉丝

逝者如斯夫,不舍昼夜


引用和评论

0 条评论