• linux Make 工具 Makefile变量


    • make工具

      1. 工程管理器、管理较多的文件                       

    Make 工程管理器也就是个"自动编译管理器",这里的"自动"

    是指它能够根据文件时间戳,发现更新过的文件而减少编译工作量同时它通过读入 

    Makefile 文件的内容来执行大量的编译工作

    2、make工具的作用

    当项目中包含了多个.c文件,但只对其中一个文件进行了修改,那用 gcc 编译会将所有的文件从头到尾编译一遍,这样的效率非常低

    所以通过 make 工具,可以查找到修改过的文件(根据时间戳),只对修改过的文件进行编译,这样大大减小了编译的时间,提高编译效率

    3、Makefile 是 make 读入的唯一配置文件

    Makefile是工程文本文件

    4、Makefile的编写格式

    格式:

    目标:依赖

    命令

    Makefile 根据以下步骤编写:

    gcc xx.o -o xx

    gcc -c xxx.c -o xx.o

    例如:写一个Makefile文件

    1. main: main.o add.o
    2. gcc main.o add.o -o main
    3. main.o: main.c
    4. gcc -c main.c -o main.o
    5. add.o: add.c
    6. gcc -c add.c -o add.o

    目标: 伪命令

    伪命令它的目的不是创建目标文件,而是执行下面的命令

    1. #第一个版本
    2. mainmain.o add.o
    3. gcc main.o add.o -o main
    4. main.omain.c
    5. gcc -c main.c -o main.o
    6. add.oadd.c
    7. gcc -c add.c -o add.o
    8. .PHONYclean #.PHONY 告诉电脑clean不是文件
    9. clean:
    10. rm -rf *.o main

    执行:make clean

    规则中 rm 命令不是为了创建 clean 这个文件而是执行删除命令。当工作目录中不存在clean 命名文件时,执行 make clean 命令 rm -rf *.o main总会被执行。

    如果避免同名文件加 .PHONY:伪命令

    二、Makefile 变量

    自己定义的变量:一般用大写表示变量名,取变量值用 $(变量名)

    1) = 递归方式展开

    1. VAR=hello
    2. SUM=$(VAR) world # 递归展开,后面 VAR 改变 SUM 也会跟着变
    3. VAR=123

    2) :=  直接赋值(当前的值是什么就立即赋值)

    3) += 追加新的值

    4) ?= 判断之前是否定义,如果定义了,不重新赋值,否则赋值

    1. VAR=hello
    2. SUM:=$(VAR) world # 直接赋值,后面 VAR 改变 SUM 不会跟着变
    3. VAR=123
    4. SUM+=456 #在后面追加上新的值
    5. SUM?=789 #进行判断,判断之前死否定义,如果定义不能重新赋值,否则赋值
    6. all:
    7. echo $(VAR)
    8. echo $(SUM)

    预定义变量

    系统预定义好的一些变量,可能有默认值也可能没有

    RM 文件删除程序的名称,默认值为 rm -f

    CC   C编译器的名称,默认值为cc

    CPP  C预编译的名称,默认值为$(CC) -E

    CFLAGS C编译器的选项,无默认值

    OBJS 生成的二进制文件或目标文件,自己定义

    1. #第二个版本
    2. CC=gcc
    3. CFLAGS=-c -g -Wall #-c编译 -g加调试 -Wall显示警告
    4. OBJS=main.o add.o
    5. main: $(OBJS)
    6. $(CC) $(OBJS) -o main
    7. main.o: main.c
    8. $(CC) $(CFLAGS) main.c -o main.o
    9. add.o: add.c
    10. $(CC) $(CFLAGS) add.c -o add.o
    11. .PHONY: clean
    12. clean:
    13. $(RM) *.o main

    自动变量

    $< 第一个依赖文件的名称

    $@ 目标文件的完整名称

    $^ 所有不重复的依赖文件,以空格分开

    1. #第三个版本
    2. CC=gcc
    3. CFLAGS=-c -g -Wall #-c编译 -g加调试 -Wall显示警告
    4. OBJS=main.o add.o
    5. main: $(OBJS)
    6. $(CC) $^ -o $@
    7. main.o: main.c
    8. $(CC) $(CFLAGS) $< -o $@
    9. add.o: add.c
    10. $(CC) $(CFLAGS) $< -o $@
    11. .PHONY: clean
    12. clean:
    13. $(RM) *.o main

    可以用%.c和%.o替换所有.c和.o文件

    1. #第四个版本
    2. CC=gcc
    3. CFLAGS=-c -g -Wall #-c编译 -g加调试 -Wall显示警告
    4. OBJS=main.o add.o
    5. main: $(OBJS)
    6. $(CC) $^ -o $@
    7. %.o: %.c
    8. $(CC) $(CFLAGS) $< -o $@
    9. .PHONY: clean
    10. clean:
    11. $(RM) *.o main

  • 相关阅读:
    【C++设计模式之外观模式】分析及示例
    C语言学习笔记(三)
    国庆10.04
    小白C语言编程实战(15):演示插入排序
    EFCore 6.0入门看这篇就够了
    【网络安全】安全事件管理处置 — 应急响应简介
    图论04-【无权无向】-图的广度优先遍历
    云盘行业的“冰与火”
    Python 中导入csv数据的三种方法
    Postman接口Mock Server服务器设置
  • 原文地址:https://blog.csdn.net/m0_74937538/article/details/132634355