• Linux第七章


    🐶博主主页:@ᰔᩚ. 一怀明月ꦿ 

    ❤️‍🔥专栏系列:线性代数C初学者入门训练题解CC的使用文章「初学」C++linux

    🔥座右铭:“不要等到什么都没有了,才下定决心去做”

    🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

    目录

    Make/Makefile

    Makefile文件格式

    make在执行的时候,默认是从Makefile置顶向下执行的,每次只执行一次

    .PHONY修饰,生成伪目标,这样命令就可以总是被执行

    make、makefile是具有依赖性的推导能力

    语法扩展

    stat指令

    Access时间


    Make/Makefile

    make是一个用于自动构建可执行文件、程序库或者其它类型文件的工具,它通过读取一个名为Makefile的文件来执行构建过程。Makefile文件包含了一系列规则,规定了文件之间的依赖关系以及如何生成目标文件。

    make工具通过比较目标文件和依赖文件的时间戳来确定哪些文件需要重新编译,从而实现增量编译,提高了编译的效率。

    举例来说,如果你有一个C语言项目,其中有多个源文件需要编译成可执行文件,你可以使用make来简化编译过程。你可以创建一个Makefile,在其中定义每个目标文件的依赖关系和编译规则,然后通过运行make命令来执行编译。

    Makefile文件的语法比较灵活,你可以在其中使用各种命令和变量来实现复杂的编译过程控制。通常,Makefile文件会包含一些标准的规则,比如all用于构建所有目标文件,clean用于清除生成的中间文件等

    Makefile文件格式

    注释:

    #开头的行表示注释,用于解释Makefile的内容。

    定义变量:

    通过变量名 = 值的格式定义变量,方便在后续使用中引用。比如CC = gcc定义了CC变量为gcc编译器。

    默认目标:

    通过all: program指定了默认目标为program,当执行make命令时,会构建program目标。

    目标、依赖、命令:

    每个目标规则由目标、依赖和命令三部分组成。目标是要生成的文件或任务,依赖是生成目标所需要的文件或任务,命令是生成目标的具体操作。

    清理目标文件:

    通过clean目标定义了一个用于清理中间文件的规则,执行make clean命令时会删除生成的可执行文件和中间目标文件。

    注意,Makefile中的命令必须以一个Tab键开始,而不是空格。否则make工具会报错。

    事例

    1. # 注释以 "#" 开头
    2. # 定义变量
    3. CC = gcc
    4. CFLAGS = -Wall -O2
    5. # 默认目标
    6. all: program
    7. # 目标: 依赖
    8. # [Tab]命令
    9. program: main.o utils.o
    10. $(CC) $(CFLAGS) -o program main.o utils.o
    11. main.o: main.c utils.h
    12. $(CC) $(CFLAGS) -c main.c
    13. utils.o: utils.c utils.h
    14. $(CC) $(CFLAGS) -c utils.c
    15. # 清理目标文件
    16. clean:
    17. rm -f program *.o

    make在执行的时候,默认是从Makefile置顶向下执行的,每次只执行一次

    事例

    1. [BCH@hcss-ecs-6176 9_12]$ cat Makefile
    2. mycode:code.c
    3. gcc code.c -o mycode
    4. .PHONY:clean
    5. clean :
    6. rm -f mycode
    7. [BCH@hcss-ecs-6176 9_12]$ make//会执行gcc code.c -o mycode
    8. make: “mycode”是最新的。
    9. [BCH@hcss-ecs-6176 9_12]$ vim Makefile
    10. [BCH@hcss-ecs-6176 9_12]$ cat Makefile
    11. .PHONY:clean
    12. clean :
    13. rm -f mycode
    14. mycode:code.c
    15. gcc code.c -o mycode
    16. [BCH@hcss-ecs-6176 9_12]$ make//会执行 rm -f mycode
    17. rm -f mycode

    .PHONY修饰,生成伪目标,这样命令就可以总是被执行

    1. .PHONY:clean
    2. clean :
    3. rm -f mycode
    4. mycode:code.c
    5. gcc code.c -o mycode
    6. [BCH@hcss-ecs-6176 9_12]$ make mycode
    7. make: “mycode”是最新的。
    8. [BCH@hcss-ecs-6176 9_12]$ make mycode
    9. make: “mycode”是最新的。
    10. 执行make命令时,只会被执行 gcc code.c -o mycode,如果
    11. 我们想执行 rm -f mycode,只需在终端输入make clean

    make、makefile是具有依赖性的推导能力

    1. mycode:code.o//code.o必须存在,如果不存在往下推,直到推出存在,否则命令执行错误
    2. gcc code.o -o mycode
    3. code.o:code.s//code.s必须存在,如果不存在往下推,直到推出存在,否则命令执行错误
    4. gcc -c code.s -o code.o
    5. code.s:code.i//code.i必须存在
    6. gcc -S code.i -o code.s
    7. code.i:code.c//code.c必须存在,如果不存在往下推,直到推出存在,否则命令执行错误
    8. gcc -E code.c -o code.i
    9. clean :
    10. rm -f mycode code.i code.s code.o

    语法扩展

    1. 1)执行make时不回显
    2. [BCH@hcss-ecs-6176 9_12]$ make
    3. gcc code.c -o mycode//显示依赖方法
    4. 只需要把Makefile文件更改为
    5. mycode:code.c
    6. @gcc code.c -o mycode//在依赖方法前加@
    7. clean :
    8. @rm mycode
    9. 注意:在makefile中注释用’#’
    10. 例如
    11. #mycode:code.c
    12. # @gcc code.c -o mycode
    13. # @echo "编译完成"
    14. #clean :
    15. # @rm mycode
    16. # @echo "清理成功"
    17. 2)makefile可以定义变量(这里变量也可以看成宏,和脚本语言类似)
    18. cc=gcc
    19. src=code.c
    20. target=mybin
    21. $(target):$(src)
    22. $(cc) $(src) -o $(target)
    23. clean:
    24. rm $(target)
    25. 3)makefile里面的简写
    26. mycode:code.c
    27. gcc $^ -o $@//$^代表依赖方式中:右侧文件列表 $@代表依赖方式中:左侧的目标文件
    28. .PHONY:clean
    29. clean:
    30. rm mycode

    stat指令

    stat指令用于显示文件的详细信息,包括文件的权限、大小、创建时间、修改时间等

    它的基本用法如下:

    stat [文件名]

    事例

    1. bch@hcss-ecs-6176:~$ stat bch.txt
    2. File: bch.txt
    3. Size: 20 Blocks: 8 IO Block: 4096 regular file
    4. Device: fc01h/64513d Inode: 2235113 Links: 1
    5. Access: (0664/-rw-rw-r--) Uid: ( 1000/ bch) Gid: ( 1000/ bch)
    6. Access: 2024-04-21 21:51:00.614596294 +0800
    7. Modify: 2024-04-21 21:51:00.442594341 +0800
    8. Change: 2024-04-21 21:51:00.442594341 +0800
    9. Birth: 2024-04-21 21:50:14.446072315 +0800

    被访问:Access会被改变

    更改内容:Modify会被改变

    改变属性:Change会被改变

    Access时间

    1. 因为这里只观察访问时间,所以删掉了其他无关的部分
    2. [BCH@hcss-ecs-6176 9_12]$ stat code.c
    3. 最近访问:2023-09-13 20:13:41.451827601 +0800
    4. [BCH@hcss-ecs-6176 9_12]$ cat code.c
    5. [BCH@hcss-ecs-6176 9_12]$ stat code.c
    6. 最近访问:2023-09-13 20:13:41.451827601 +0800//时间并没有改变
    7. [BCH@hcss-ecs-6176 9_12]$ cat code.c
    8. [BCH@hcss-ecs-6176 9_12]$ stat code.c
    9. 最近访问:2023-09-13 20:13:41.451827601 +0800//时间并没有改变
    10. 一般而言,一个文件被查看的频率是非常高的
    11. 我们所看到的文件,都是在磁盘存放的,更改时间的本质:其实是访问磁盘!
    12. 如果每次查看都要更改Access时间,linux系统充满大量的访问磁盘的IO操作,变向减慢系统效率
    13. 所以呢,现在的linux新版本在更改Access时间时,添加了次数限制

    如果我们直接更新一下文件时间,可以让源文件变成最新的(没有改内容)

    1. touch 文件名//如果文件存在,该文件的时间会被改变
    2. 例如
    3. [BCH@hcss-ecs-6176 9_12]$ make mycode
    4. make: “mycode”是最新的。
    5. [BCH@hcss-ecs-6176 9_12]$ touch code.c//更改code.c的三种时间
    6. [BCH@hcss-ecs-6176 9_12]$ make mycode
    7. gcc code.c -o mycode

     🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸 

  • 相关阅读:
    如何提高系统的可用性/高可用
    OSM+three.js打造3D城市
    HTML入门篇---02列表、表格、表单标签
    接龙管家-Python自动打卡(续)获取接龙管家token
    Batch设计注意点
    2022-07-04 反省
    JVM命令:jsp(找进程),jstack(线程栈),jmap(内存),jinfo(参数)
    jmeter-http post请求
    【MySQL】MySQL的安装
    HTML+CSS+JS实现【别踩鸡块】,ikun粉快来瞅瞅(含源码链接在文末+思路)
  • 原文地址:https://blog.csdn.net/m0_67846057/article/details/138160068