美文网首页
makefile语法基础

makefile语法基础

作者: migill | 来源:发表于2019-11-15 20:05 被阅读0次
1、什么是makefile?
  • makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要重新编译,如何进行链接等操作。
  • makefile 就是“自动化编译”,告诉make命令如何编译和链接。
2、makefile里有什么?

makefile包含以下五个:

  • 显示规则
  • 隐晦规则
  • 变量定义
  • 文件指示
  • 注释
3、makefile的规则
target ...  :  prerequisites ...
command
或者:
target ... : prerequisites... ;command

  • target:目标文件。可以是Object File,也可以是执行文件,还可以标签(Label)
  • prerequisites:依赖文件,既要生成那个target所需要的文件或其他target
  • command:make需要执行的命令

makefile 示例

#当前目录存在main.c tool.c tool.h三个文件
#下面是makefile文件内容
main: main.o too.o
    gcc main.o tool.o -o main
.PHONY: clean
clean:
   -rm main *.o
----------------------------------------------
//执行make后输出如下
cc -c -o main.o main.c
cc -c -o tool.o tool.c
//生成一个可执行文件main
gcc main.o tool.o -o main
  • -o:指定可执行文件的名称。
  • clean:标签,不会生成“clean”文件,这样的target称之为伪目标,伪目标的名字不能和文件的名字重复。clean一般放在文件最后。
  • .PHONY:显示的表明clean是一个伪目标。
4、makefile是如何工作的?

默认方式下,输入make命令后:

  • make会在当前目录下找名字叫“Makefile”或者“makefile”的文件。
  • 如果找到,他会找文件中第一个目标文件(target),并把这个target作为最终的目标文件,如前面实例中的main。
  • 如果main文件不存在,或main所依赖的.o文件的修改时间要比main文件要新,那么它会执行后面所定义的命令来生成main文件。
  • 如果main所依赖的.o文件也存在,那么make会在当前文件中到目标为.o文件的依赖性,若找到则根据规则生成.o文件。
  • make再用.o文件声明make的最终任务,也就是执行文件“main”。
5、makefile中使用变量?
  • 为了makefile的易维护,在makefile中我们可以使用变量。makefile的变量也就是一个字符串,理解成c语言中的宏可能更好。
  • 比如,我们生成一个变量,叫objects,于是,我们就可以很方便的在我们的makefile中以$(objects)的方式来使用这个变量了。
objects = main.o tool.o
main: $(objects)
    gcc $(objects) -o main

.PHONY:clean
clean:
    -rm main $(objects)
-------------------------------------------
//执行make后输出如下
cc -c -o main.o main.c
cc -c -o tool.o tool.c
//生成一个可执行文件main
gcc main.o tool.o -o main
6、makefile中如何引用其他的makefile?
  • 使用include关键字可以把其它Makefile包含进来,include语法格式:
    include <filename>
#语法格式
include <filename>
#举个例子,你有这样几个 Makefile: a.mk、b.mk、c.mk,还有一个文件叫 foo.make,以及一个变量$(bar),其包含了e.mk 和 f.mk 
include foo.make *.mk $(bar)
#等价于:
include foo.make a.mk b.mk c.mk e.mk f.mk
#如果文件找不到,而你希望make时不理会那些无法读取的文件而继续执行,可以在include前加一个减号“-”,如:
-include <filename>
7、环境变量 MAKEFILES
  • 如果当前环境变量中定义了环境变量MAKEFILES,那么,make会把这个变量中的值做一个类似于 include 的动作。这个变量中的值是其它 Makefile,用空格分隔。只是,它和include不同的是,从这个环境变量中引入的 makefile 的“目标”不会起作用,如果环境变量中定义的文件发现错误,make也会不理。但是建议不要使用这个环境变量,因为只要这个变量一被定义,那么当你使用make时,所有的makefile都会受到它的影响,也许有时候makefile出现了奇怪的事,那么可以查看当前环境中有没有定义这个变量。
8、makefile预定义变量
9、makefile自动变量
9、makefile函数
#不带参数
define FUNC
$(info echo "hello")
endif
$(call FUNC)
-----------------------------
输出:hello

#带参数
define FUNC1
$(info echo $(1) $(2))
endif
$(call FUNC1,hello,world)
-----------------------------
输出:hello world
10、make的工作流程

GNU的make工作时的执行步骤如下:

  • 1 读入所有的Makefile。
  • 2 读入被include的其他Makefile。
  • 3 初始化文件中的变量。
  • 4 推到隐晦规则,并分析所有规划。
  • 5 为所有的目标文件创建依赖关系链。
  • 6 根据依赖关系,决定哪些目标要重新生成。
  • 7 执行生成命令

相关文章

  • makefile | makefile语法基础

    makefile是为make指令提供信息的文件。make指令直接解析makefile。因此我们从make指令的起源...

  • makefile语法基础

    1、什么是makefile? makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要重新编译,...

  • Makefile学习

    Makefile学习 参考自《跟我一起写Makefile》陈皓 Makefile 的语法规则 基本语法 翻译成中文...

  • 迅为IMX6ULL开发板Ubuntu下C编程入门(二)

    本文是介绍3.3 初识 Makefile+3.4Makefile语法 3.3初识Makefile 3.3.1什么是...

  • makefile简述

    makefile 基本语法 目标文件:依赖文件[Tab] 命令 上述makefile语法被称为一组规则 目标文件是...

  • JNI基础--makefile走读与语法基础

    makefile makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要重新编译,如何进行链接...

  • CMakeList语法知识

    在写这篇文章之前开始是想一些shell脚本与Makefile的一些基础语法知识。但是又觉得太过基础。关于Liunx...

  • Android NDK开发-MakeFile语法基础

    概念 1.makefile定义了一系列规则来指定,哪些文件需要先编译,哪些文件需要重新编译,如何进行链接等操作;2...

  • Makefile编写相关

    一、编写一个高质量Makefile的要求1、熟练掌握Makefile的语法2、提前规划Makefile需要实现的功...

  • DiskSim 4 源码 - D2 - Makefile

    今天继续回来,继续makefile部分。先还是一些makefile语法。 Makfile中的各种 *FLAGS C...

网友评论

      本文标题:makefile语法基础

      本文链接:https://www.haomeiwen.com/subject/yybdictx.html