一、Makefile的作用

Makefile文件实质上就是一个工程代码编译脚本,一旦写好,只需要一个make命令,整个工程就会自动按照脚本的规定方式编译,极大的提高了软件开发的效率。

make是系统指令,它是根据自己的配置文件,可以进行工程管理的指令。文件放在目录,要编译哪个目录的文件,要链接哪个目录的文件....
    
    makefile是make指令对应的一个配置,当输入make回车时,执行makefile里面的所有配置指令,一一执行。
    makefile的组成:makefile的语法+shell指令。(任何linux里面用到的shell指令都可以加入进去)

二、make 命令使用

三、makefile的编写规则
    基本语法如下:
    目标文件:依赖文件
    (tab)执行指令集合
    工作原理:(修改时间比较的原理)
        1.识别目标文件,去找到他的依赖文件(如果找得到)
        2.执行情况
            (1)如果发现目标文件不存在,同时依赖文件存在,就会执行指令集合。
            (2)如果发现目标文件已经存在了,同时依赖问价存在,make指令会自动去比较两者的修改时间
                    修改时间:依赖文件 > 目标文件,就会执行指令集合。
                    修改时间:依赖文件 <= 目标文件,就不会执行指令集合。同时会提示目标文件已经是最新的
     
        注意点:makefile之后从第一个规则体的依赖文件去操作,只会操作出现的依赖文件.   
        最常用的规则:(多个.c生成一个可执行文件)
        目标文件(最终目标):依赖文件(n个)
            执行指令
        目标文件(依赖文件(n个)):依赖文件
            执行指令

四、伪指令

all  跟  make+目标文件
        all表示最终目标,后来的依赖文件就可以写可执行文件,不需要写指令。
        如果在all后面的依赖文件没有出现clean,但是你写了clean。那么makefile是不会自动执行clean,只有当单独输入make clean时,才会独立执行clean执行指令。
        在许多Makefile中都可以看到.PHONY:xxx之类的语句,其含义就是定义xxx为伪目标,当一个目标被声明为伪目标后,make在执行规则时不会去试图去查找隐含规则来创建它。

可近似的理解为编译可选项:等用户想操作的时候才执行,用户不操作,不会自动执行。

参考博客: https://www.cnblogs.com/samuelwnb/p/3895191.html

五、makefile中的变量
        实际上变量只能存储字符串。
        定义:变量名 = “字符串”
        使用:$(变量名)
        赋值方式:
            直接对变量本身进行操作
             =    递归展开赋值,当对一个变量进行操作时,如果这个变量后后面有变化,这个变量不会马上赋值,会一直找到最后一次变量,再进行赋值。
            :=    就地展开赋值,当对一个变量进行操作,直接使用这个变量当前的值,而不受后面任何变量。
            
            在变量的基础上加上东西
            +=    对某个变量的值,进行追加
            ?=    如果变量没有初始化,则对其初始化

六、自动变量
    所有自动变量,自己本身存在的特定的作用。
    $*    不包含拓展名的目标文件名称。
    $+    所有的依赖文件名称,但是可能出现同名的。
    $^    所有的依赖文件名称,但是不会出现同名的。
    $<  第一个依赖文件的名称。
    $@    目标文件的完整名称
    $?    所有已经更新的依赖文件的名字。(比目标文件要新的依赖文件)
        
    模式规则:(%),只要在文件中,出现%符号,那就代表是模式规则。等效于shell指令的*通配符。
    自动根据目标文件,去配对对应的依赖文件。自动顺序的配对

七、makefile的函数
    makefile内部是允许自定义函数/使用函数。
    函数的用法:
        $(函数名 函数参数列表)
        wildcard:文件名展开函数。将所有用户想要找到的文件名给得到(用户想要得到的文件名可以通过通配符)。
        用法:$(wildcard 可变参数列表) 
                返回值:已经找到的文件名列表,每个文件名都加上空格。
        $(wildcard *.c)
        
        patsubst:替换字符串输出。按照用户指定的替换方式,对相应的字符串进行替换。
        用法:$(patsubst <form>,<to>,<text>)
                test:要进行替换的原始数据,字符串123s1df32asf5  123%
                根据form里面格式的定义,替换称为to里面的格式。
             $(patsubst %.c,%.o,"1.c 2.c ")

八、通用Makefile框架,适用于一般中小型项目

TARGET := ../bin/main
CC := gccINCLUDE:= -I ../includeLIBS:= -lpthreadCSRCS := $(wildcard *.c)
OBJS := $(patsubst %.c, %.o, $(CSRCS))$(TARGET): $(OBJS) $(CC) $+ -o $@  $(LIBS)
%.o:%.c$(CC) -c -g $< -o $@ $(INCLUDE)clean:rm -rf $(OBJS) $(TARGET)#rm *.o

九、库依赖顺序

当一个工程链接的库较多时,很多时候因为库之间的依赖问题导致一直编译不过。此时要捋清库之间的依赖关系,然后按依赖顺序(越底层的库越往后放)链接即可。

顺序应该如下:

LIBS :=  -l(应用层lib) -l(基础lib) -l(系统lib)

查看库依赖关系的命令有为:

# readelf -d [库名]

# ldd [库名]

十、Makefile调用shell命令

Makefile脚本中,是可以直接调用shell命令的,并且在执行make时,能看到执行的shell语句。

在shell命令前添加:'@' 符号, 则可以不显示命令本身而只显示结果。

在shell命令前添加: '-'  符号,则运行该条shell命令失败时,不会中断Makefile脚本的后续执行。

Makefile文件语法规则及用法总结相关推荐

  1. Makefile文件编写规则

    From: http://aviva.iteye.com/blog/807494 Makefile中包含五种内容:显式规则,隐式规则,变量定义,指令(directive)和注释. 1.显式规则――描述 ...

  2. Makefile文件的编写规则

    欢迎大家关注笔者,你的关注是我持续更博的最大动力 Makefile文件编写规则 文章目录: 1 makefile文件介绍 2 makefile文件编写 1 makefile文件介绍 makefile是 ...

  3. C语言makefile文件

    文章目录 一.makefile的编写 二.make命令 三.makefile文件中的变量 四.应用经验 五.课后作业 六.版权声明 在软件的工程中的源文件是很多的,其按照类型.功能.模块分别放在若干个 ...

  4. 基础知识(三)makefile文件编写初级篇

    linux下进行c++开发,需要熟悉相关编译器的编译.链接命令.这边主要以实例讲解,如何在linux中,进行c++程序简单的编译链接运行. 一.单文件编译链接 这里先从最简单的单个文件编译链接为例.在 ...

  5. 编写Makefile文件

    续GCC编译器 1.编写Makefile UNIX系统上很多软件包都是使用make程序和Makefile文件来实现自动编译的,make程序的目的就是自动确定一个软件包的哪些部分需要重新编译,并用特定的 ...

  6. 解析Makefile文件的构建规则

    2019独角兽企业重金招聘Python工程师标准>>> Makefile 编辑一个工程中的源文件不计其数,其按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则 ...

  7. C语言:gcc编译过程及make命令、makefile语法规则

    gcc编译过程 编译过程: make && makefile make概述 makefile语法规则 make命令格式 Makefile案例 之所以写成多个文件,是出于模拟多模块编程的 ...

  8. 2.Makefile文件中包含哪些规则?

    想要书写一个完整的 Makefile文件,需要了解 Makefile 的相关的书写规则.我们已经知道了 Makefile 描述的是文件编译的相关规则,它的规则主要是两个部分组成,分别是依赖的关系和执行 ...

  9. 一文详解CMakeLists文件编写语法规则详解

    作者丨zhanghm1995@blog 来源丨https://blog.csdn.net/zhanghm1995/article/details/80902807 编辑丨3D视觉工坊 基本语法规则 C ...

最新文章

  1. epoch如何设置_使用TFRecordDataset时如何设置epoch计数器?
  2. 亲爱的,别把上帝缩小了 ---- 读书笔记2
  3. 2、ACE-实用生活口语-介绍 Introductions
  4. 【思维导图】脑机音乐接口,高效检测用户的情绪状态
  5. pycharm管理多个工程
  6. c语言中的关于数学问题的编程,C语言中具有代表性几种数学问题编程技巧探索.doc...
  7. 1063 Set Similarity
  8. uva 120——Stacks of Flapjacks
  9. malloc动态分配数组以及指针数组大小
  10. opencv方框内图像保存_opencv 图像滤波(均值,方框,高斯,中值)
  11. ajax 上传文件实例,Ajax 之文件上传
  12. centos7设置分辨率
  13. 深入理解Symbol
  14. (2022)安卓和苹果应用注册上架概述
  15. 自然常数e的由来以及计算机为什么是二进制
  16. 解读BLM业务领先模型中的业务设计
  17. java时区ZoneId集
  18. owt webrtc 音频没有声音
  19. clover EFI bootloaderfor mac(10.12)官方版下载
  20. 修改本地Git用户名、密码

热门文章

  1. 暑期后端培训(sql语句及数据库连接)
  2. 在gym的BipedalWalker-v2环境里面训练了agent
  3. 论文笔记:Deeply-Learned Part-Aligned Representations for Person Re-Identification
  4. csp2015-12
  5. CSS Design: Going to Print
  6. 意味着你面试有戏的6大信号|智测优聘总结
  7. oracle表空间追加数据文件,oracle数据库表空间追加数据库文件方法
  8. iOS中关于苹果审核IPv6的问题
  9. 利用JVM在线调试工具排查线上问题(超实用)
  10. 计算机应用基础课程设计评语,计算机应用基础课程设计