• 【Linux】基础:Linux环境基础开发工具——make与Makefile


    【Linux】题解:Linux环境基础开发工具——make与Makefile

    摘要:Makefile是一个文件定义了一系列的规则来指定编译过程以及更复杂的功能操作,make是一个命令工具,是一个解makefile中指令的命令工具。


    一. 概述

    Linux作为一个操作系统,有着自己开发程序的方式。各位都知道,Linux主要面向的是像程序员这样的群体,因此缺少像VS或者Pycharm等那样的庞大的商用的集成开发工具。不过Linux也是可以做到,像其他IDE那样进行开发,主要的实现方式就是通过指令的形式进行完成。

    Linux环境基础开发工具包括六大板块:

    • 学习yum工具,进行软件安装
    • 掌握vim编辑器使用,学会vim的简单配置
    • 掌握gcc/g++编译器的使用,并了解其过程,原理
    • 掌握简单gdb使用于调试
    • 掌握简单的Makefile编写,了解其运行思想
    • 学习 git 命令行的简单操作, 能够将代码上传到码云上

    最后,还会通过使用Linux环境下基础开发工具,完成一个C语言的小示例——进度条

    本篇将会介绍关于Makefile的内容。

    二. make与Makefile

    Makefile是一个文件,在一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,对于makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

    make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。

    要学会Makefile文件的书写,最主要的就是掌握依赖关系与书写依赖方法。

    三. 依赖关系与依赖方法

    对于依赖关系,可以认为要生成相应对象,就要通过另外一个对象去产生,好比gcc test.c -o test,此时的test就是依赖于test.c 文件。而依赖方法就是如何通过被依赖关系产生依赖对象的,而gcc test.c -o test就是依赖方法。两者之间的关系时相辅相成,既要有关系,也要有依赖方法

    如果需要编写一个Makefile文件,首先touch Makefile一个文件,在通过vim编写,示例如下:

    [lht@VM-12-7-centos Blog_Develope]$ touch Makefile
    [lht@VM-12-7-centos Blog_Develope]$ vim Makefile 
    [lht@VM-12-7-centos Blog_Develope]$ cat Makefile 
    test:test.c
            gcc test.c -o test -std=C99
    
    .PHONY:clean
    clean:
            rm -f test
    [lht@VM-12-7-centos Blog_Develope]$ ll
    total 28
    -rw-rw-r-- 1 lht lht    74 Oct 30 22:46 Makefile
    -rw-rw-r-- 1 lht lht   226 Oct 30 20:19 test.c
    [lht@VM-12-7-centos Blog_Develope]$ make
    gcc test.c -o test -std=c99
    [lht@VM-12-7-centos Blog_Develope]$ ./test 
    result = 5050
    [lht@VM-12-7-centos Blog_Develope]$ make clean 
    rm -f test
    [lht@VM-12-7-centos Blog_Develope]$ ll
    total 28
    -rw-rw-r-- 1 lht lht    74 Oct 30 22:46 Makefile
    -rw-rw-r-- 1 lht lht   226 Oct 30 20:19 test.c
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    注意看cat后文件显示,通过设定依赖关系:test:test.c,在下一行通过Tab格式化后,设定依赖方法:gcc test.c -o test -std=C99,通过make,就可以默认编译第一条语句,也可以通过输入make test进行编译工作。因此,对于要生成过程一般是放在最前面的,直接make就可以生成可执行文件了。

    对于Makefile中的.PHONY可以称之为修饰对应的符号,类似于伪目标的概念,其特征是总是可执行的,比如在此的clean就是总是可执行的符号,像clean这种没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,使用了类似伪目标的概念,可以用make执行clean,即命令——“make clean”,以此来清除所有的目标文件,以便重编译。

    更重要的是,clean可以作为项目清除的命令,直接使用.PHONY来定义伪目标简化项目清除的步骤

    四. 补充:特殊符号

    Makefile可以通过特殊符号来直接将依赖关系对应到依赖方法上,如下示例:

    [lht@VM-12-7-centos Blog_Develope]$ cat Makefile 
    test:test.c
            gcc -o $@ $^
    
    .PHONY:clean
    clean:
            rm -f test
    [lht@VM-12-7-centos Blog_Develope]$ make
    gcc -o test test.c
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    其中$@对应的是生成文件,$^对应的是所依赖的对象,可以通过这种方式简化Makefile的书写


    补充:

    1. 代码将会放到:https://gitee.com/liu-hongtao-1/linux_-review ,欢迎查看!
    2. 欢迎各位点赞、评论、收藏与关注,大家的支持是我更新的动力,我会继续不断地分享更多的知识!
  • 相关阅读:
    JavaScript参考手册 String函数 7080字
    Spring.事务实现方式和源码分析
    找准边界,吃定安全 | 流量剧增?看山石网科如何打破传统限制
    LETCODE_2356_每位教师所教授的科目种类的数量
    【day7】Scanner类、Random类、ArrayList类
    代码随想录Day42-图论:力扣第417m、841m、463e题
    自学软件测试,学到什么程度可以出去找工作啊?
    nginx loadbalance spring server负载均衡
    js中减少if-else的几个小技巧
    复合类型(自定义类型)
  • 原文地址:https://blog.csdn.net/qq_66725576/article/details/127625371