• Makefile 初探


    • Makefile简介

    Makefile是一些编译规则(规定了各种依赖关系)和一些命令的集合,可以说是大型工程必须可少的一部分。之前从未接触过Makefile,直到下载点云库自己编译时以及编译一些开源代码时才发现Makefile。Makefile可以说命令的集合,make则是命令的解释工具。那么如何编写Makefile呢?下面是我参考陈皓大神和网上其他一些博客的简单总结。

    • Makefile组成

    可以把Makefile看成由以下5个部分组成:

    1、显示规则,即目标是为什么,依赖文件是什么,命令是什么都清晰的写出来

    2、隐晦规则,比如a.o : a.h则可由make自动展开为a.o : a.c a.h       g++ -c a.o a.c

    3、变量定义

    4、文件指示(Makefile包含其他Makefile),使用include

    5、注释,使用‘#’

    • Makefile初级用法
    • 简单规则

    1、最终目标文件一般放在最开始的位置,然后根据依赖关系递归地添加其他目标文件和依赖关系

    2、命令以Tab键开始

    3、换行符‘’

    4、在规则中可以直接使用通配符,如

      clean :

        rm -f  *

    5、变量替换用 $()

    • 路径搜索

    我们组织工程时,一般.h文件放在head文件夹,.c文件放在source文件夹,那么在当前文件夹可以就搜索不到文件,那么必须指定搜索路径

    我们可以用VPATH指定附加的搜索路径,如

    # 示例1 - 当前目录中找不到文件时, 按顺序从 src目录 ../parent-dir目录中查找文件,文件之间以:为分隔符
    VPATH src:../parent-dir 

    当然我们还可以使用make的关键字vpath

    # 示例2 - .h结尾的文件都从 ./header 目录中查找
    vpath %.h ./header
    
    # 示例3 - 清除示例2中设置的规则
    vpath %.h
    
    # 示例4 - 清除所有VPATH的设置
    vpath
    • Makefile命令前缀

    Makefile 中书写shell命令时可以加2种前缀 @ 和 -, 或者不用前缀.

    3种格式的shell命令区别如下:

    1、不用前缀 :: 输出执行的命令以及命令执行的结果, 出错的话停止执行

    2、前缀 @   :: 只输出命令执行的结果, 出错的话停止执行

    3、前缀 -   :: 命令执行有错的话, 忽略错误, 继续执行

    • 伪目标

    如我们常用的make clean中的clean就是一个伪目标,伪目标不会自动执行。

    伪目标的一般格式为:

    .PHONY: clean   <-- 这句没有也行, 但是最好加上
    clean:
        -rm -f *.o
    • 查看文件依赖关系

    写 Makefile 的时候, 需要确定每个目标的依赖关系.

    GNU提供一个机制可以查看C代码文件依赖那些文件, 这样我们在写 Makefile 目标的时候就不用打开C源码来看其依赖那些文件了.

    比如, 下面命令显示内核源码中 virt/kvm/kvm_main.c 中的依赖关系

    $ cd virt/kvm/
    $ gcc -MM kvm_main.c 
    kvm_main.o: kvm_main.c iodev.h coalesced_mmio.h async_pf.h   <-- 这句就可以加到 Makefile 中作为编译 kvm_main.o 的依赖关系

    高级语法无非是一些宏定义和Makefile函数之类的,可以参考博客

  • 相关阅读:
    LR和SVM等线性模型比较
    博客内容和格式整理想法
    matlab安装matconvnet出错总结
    《java 核心技术一》第二章java程序设计环境
    《java 核心技术一》第一章 程序设计概论
    java eclipse 程序没错,运行结果显示无法加载主类的解决方法
    《贾平凹--朋友圈子就是你人生的世界》读后感
    java try-catch-finally输出异常
    暑假计划
    java 登录注册小程序
  • 原文地址:https://www.cnblogs.com/coderht/p/7224981.html
Copyright © 2020-2023  润新知