zoukankan      html  css  js  c++  java
  • 关于makefile的那些事儿

    最近越来越感觉到,在linux下面身为一个程序员,不会makefile就不是一个合格的程序员,所以今天我们介绍下常用的makefile编写.

    了解知识:
      编译:把高级语言书写的代码转换为机器可识别的机器指令。编译高级语言后生成的指令虽然可被机器识别,但是还不能被执行。编译时,编译器检查高级语言的语法、函数与变量的声明是否正确。只有所有的语法正确、相关变量定义正确编译器就可以编译出中间目标文件。通常,一个高级语言的源文件都可对应一个目标文件。目标文件在Linux 中默认后缀为".o"(如“ foo.c”的目标文件为“ foo.o”)。

      链接:将多.o 文件,或者.o 文件和库文件链接成为可被操作系统执行的可执行程序( Linux 环境下,可执行文件的格式为“ ELF”格式)。链接器不检查函数所在的源文件,只检查所有.o 文件中的定义的符号。将.o 文件中使用的函数和其它.o 或者库文件中的相关符号进行合并,对所有文件中的符号进行重新安排(重定位),并链接系统相关文件(程序启动文件等)最终生成可执行程序。

    Makefile简介 :
          当使用 make 工具进行编译时,工程中以下几种文件在执行 make 时将会被编译 (重新编译):
          1. 所有的源文件没有被编译过,则对各个 C 源文件进行编译并进行链接,生成最后的可执行程序;
          2. 每一个在上次执行 make 之后修改过的 C 源代码文件在本次执行 make 时将会被重新编译;
          3. 头文件在上一次执行 make 之后被修改。则所有包含此头文件的 C 源文件在本次执行 make 时将会被重新编译。
          后两种情况是 make 只将修改过的 C 源文件重新编译生成.o 文件,对于没有修改的文件不进行任何工作。重新编译过程中,任何一个源文件的修改将产生新的对应的.o文件,新的.o 文件将和以前的已经存在、此次没有重新编译的.o 文件重新连接生成最后的可执行程序。

    makefile的基本规则: 

        Makefile由一组规则组成,规则如下:

                        目标(app):依赖(main.c a.c b.c)
                                            命令(gcc main.c a.c b.c -o app)

             makefile基本规则三要素:

                         目标:要生成的目标文件

                         依赖:目标文件由哪些文件生成

                         命令:通过执行该命令由依赖文件生成目标

    makefile工作原理:

    makefile变量:

      在Makefile中使用变量有点类似于C语言中的宏定义,使用该变量相当于内容替换, 使用变量可以使Makefile易于维护,修改内容变得简单变量定义及使用。

      1).普通变量
            foo = abc            // 定义变量并赋值
            bar = $(foo)        // 使用变量,$(变量名)
            定义了两个变量:foo、bar,其中bar的值是foo变量值的引用。
           变量定义直接用’=’
           使用变量值用$(变量名)
        2)makefile中也提供了一些变量(变量名大写)供用户直接使用,我们可以直接对其进行赋值
            src = main.c func1.c func2.c
            CC = gcc #arm-linux-gcc
            CPPFLAGS : C预处理的选项如:-I
            CFLAGS: C编译器的选项–Wall –g -c
            LDFLAGS : 链接器选项–L –l
        3)自动变量
            $@:表示规则中的目标
            $<:表示规则中的第一个条件
            $^:表示规则中的所有条件,组成一个列表,以空格隔开,如果这个列表中有重复的项则消除重复项。
            注意:自动变量只能在规则的命令中中使用
        4)模式规则
            至少在规则的目标定义中要包含'%','%'表示一个或多个,在依赖条件中同样可以使用'%',依赖条件中的'%'的取值取决于其目标
                模式规则示例:
                    %.o:%.c
                        $(CC) –c $(CFLAGS) $(CPPFLAGS) $< -o $@

    makefile函数:
       makefile中的函数有很多,在这里给大家介绍两个最常用的。
      1.    wildcard – 查找指定目录下的指定类型的文件    
        src = $(wildcard *.c)//找到当前目录下所有后缀为.c的文件,赋值给src
      2.    patsubst – 匹配替换
        obj = $(patsubst %.c,%.o, $(src)) //把src变量里所有后缀为.c的文件替换成.o
      注意:在makefile中所有的函数都是有返回值的。
    clean:
      用途:清除编译生成的中间.o文件和最终目标文件
      make clean 如果当前目录下有同名clean文件,则不执行clean对应的命令,解决方案:
        伪目标声明: .PHONY:clean
            声明目标为伪目标之后,makefile将不会该目标是否存在或者该目标是否需要更新
        clean命令中的特殊符号:
                        “-”此条命令出错,make也会继续执行后续的命令。如:“-rm main.o”
                        “@”不显示命令本身,只显示结果。如:“@echoclean done”
    其它了解内容:
        make 默认执行第一个出现的目标,可通过make dest指定要执行的目标
        make -C 指定目录: 进入指定目录,调用里面的Makefile
        make -n :只打印要执行的命令,不会真正执行命令
        make -p :显示隐含规则数据库中的信息
        make -f :-f执行一个makefile文件名称,使用make执行指定的makefile


        

  • 相关阅读:
    Java基础学习总结(41)——JPA常用注解
    Java基础学习总结(41)——JPA常用注解
    【云速建站】视频播放专题
    一招教你如何修复MySQL slave中继日志损坏问题
    【nodejs原理&源码赏析(3)】欣赏手术级的原型链加工艺术
    【云速建站】后台数据批量导入导出
    【云速建站】会员注册弹窗添加及设置
    【nodejs原理&源码赏析(2)】KOA中间件的基本运作原理
    【nodejs原理&源码赏析(1)】Express中间件系统的基本实现
    补习系列(5)-springboot- restful应用
  • 原文地址:https://www.cnblogs.com/liunianshiwei/p/6108495.html
Copyright © 2011-2022 走看看