• 让你提前认识软件开发(17):makefile文件的书写及应用


    第1部分 又一次认识C语言

    makefile文件的书写及应用

     

    【文章摘要】

            makefile用于Linux下整个project的编译。对于Linux下的C/C++语言的编译是至关重要的。

           本文以实际的C源程序为样例。介绍怎样使用makefile来编译Linux下的C语言project,为相关开发工作的开展提供了參考。

     

    【关键词】

            makefile  C语言  Linux  编译  开发

     

    一、什么是makefile

            makefile是什么?假设你写的程序仅仅是在Windows下运行。那么非常有可能不知道有这个玩意儿。

    而假设你要在Linux下编译并运行程序,那么你差点儿不可避免地要和makefile打交道。

            makefile是一个文件,里面定义了一系列的规则来指定一个project中的哪些文件须要先编译,哪些文件须要后编译,哪些文件须要又一次编译,甚至进行更为复杂的功能操作。

    简单点说,makefile就是Linux下的一个编译调度器。

     

    二、makefile的语法规则

            既然是一个编译调度器,那么它就会有自己的一套规则。

    makefile的规则例如以下:

    target ... : prerequisites ...

    command

    ......

    ......

     

           说明:

           (1) target就是一个目标文件。也就是在这个步骤中,我们想要输出的文件名称(能够包含后缀)

           (2) prerequisites是要生成那个target所须要的文件,相当于在Windowsproject下我们要得到exe文件所须要的源码文件。

           (3) commandmake须要运行的命令。也就是怎样利用prerequisites来生成target。注意。command行要以TAB键开头。

     

    三、C程序源码

            本文以一个实际的Linux下的C程序project为例,介绍makefile的编写方法及使用方法。

            本文中的程序实现将一个字符串中的小写字母转换成大写字母的功能。有两个头文件:DataType.hFunDeclaration.h,放在“Header”文件夹下;有两个源文件:Main.cLowerToUpper.c,分别放在“Main”和“LowerToUpper”文件夹下。

            该projectMakeFileExample的组织形式如图1所看到的(release”文件夹用于存放生成的文件)


    1 该project的组织形式

     

    1. DataType.h”文件代码内容

     

    2. FunDeclaration.h”文件代码内容


    3. LowerToUpper.c”文件代码内容

     

    4. Main.c”文件代码内容

     

    四、makefile文件的内容

           为了对本project文件进行正确的编译,makefile文件能够例如以下编写:

    LowerToUpper : Main/Main.c LowerToUpper/LowerToUpper.c
    gcc -c -g Main/Main.c
    gcc -c -g LowerToUpper/LowerToUpper.c
    gcc -g -o release/LowerToUpper Main.o LowerToUpper.o
    rm *.o

     

           说明:

             (1) 本文件能够命名为“makefile”或“Makefile”,不能有后缀,也仅仅能有第一个字母是大写的。

             (2) 在第一行,我们终于生成的文件名称为“TestMakeFile”,要生成该文件。须要两个源文件“TestMakeFileMore1.c”和“TestMakeFileMore2.c”;对照makefile文件语法规则,target为“TestMakeFile”。prerequisites为“exec1/TestMakeFileMore1.c”和“exec2/TestMakeFileMore2.c”。

             (3) 从第二行開始是命令行。即command

             (4) 第二行和第三行要以TAB键开头,是对两个源文件进行编译,生成.o文件的语句。“-g”是为了调试用的,“-c”用于产生.o文件(就是obj文件),不产生运行文件。

    gcc -c -g exec1/TestMakeFileMore1.c”的结果是生成“TestMakeFileMore1.o”。“gcc -c -g exec2/TestMakeFileMore2.c”的结果是生成“TestMakeFileMore2.o”。

    第二行和第三行能够互换位置。

            (5)第四行也要以TAB键开头,是将“TestMakeFileMore1.o”和“TestMakeFileMore2.o”编译生成“TestMakeFile”的语句。“-o outputfilename”,让输出文件的名称为“outputfilename”。而这个名称不能和已有的文件重名。在本例中,我们将“TestMakeFile”文件放到了release文件夹下。假设想把生成文件放到随意文件夹下。都能够用此方法来实现。

           (6) 第五行也要以TAB键开头。用于删除.o文件。由于在编译过程中。有非常多.o文件生成(本例中包含“TestMakeFileMore1.o”和“TestMakeFileMore2.o),假设我们不将它们清除掉,它们会一直留在project文件夹下。本语句相当于是一个完毕任务后的清理工作。当然,假设想对.o文件进行专门的清除,那么makefile文件能够例如以下编写:

    LowerToUpper : Main/Main.c LowerToUpper/LowerToUpper.c
    gcc -c -g Main/Main.c
    gcc -c -g LowerToUpper/LowerToUpper.c
    gcc -g -o release/LowerToUpper Main.o LowerToUpper.o
    clean:
    rm *.o

            在Linux下输入“make clean”命令就可以将全部的o文件清除掉。

           (7) 假设源文件和头文件为单个或多个,可參照本makefile进行编写。

     

    五、makefile文件运行过程及程序运行结果

            依照如图1所看到的的文件夹结构组织本project,并将之上传到Linux机器上。

    1. makefile文件运行过程

           登录到Linux机器上。在makefile文件所在文件夹下输入“make”命令。运行结果例如以下:

    gcc -c -g Main/Main.c
    gcc -c -g LowerToUpper/LowerToUpper.c
    gcc -g -o release/LowerToUpper Main.o LowerToUpper.o
    rm *.o

     

            仅仅要没有出现报错信息,那么代码和makefile的编写就是正确的。

            假设代码中有语法问题。那么输入“make”命令后。在运行的结果中会打印代码出现故障的行数。方便对问题进行改动。这与VC的编译功能非常类似。

     

    2. 程序运行结果

           转到release文件夹下(运行cd release命令),输入“./TestMakeFile”命令,运行结果例如以下:

    Input the source string: aBcDeFg

    Output the destination string: ABCDEFG

     

           可见,达到了将小写字母变成大写字母的功能。

     

    六、总结

            本文对makefile文件的语法规则进行了介绍,并用一个实际的C程序project来说明了它的使用方法。

            在编写和使用makefile文件的过程中,我们要注意下面问题:

            (1) 要牢记makefile的语法。将不同程序文件的依赖关系理清楚。

            (2) 命令(command)行一定要以TAB键开头,不要误写成了空格。

            (3) makefile文件的最后。要将没实用的中间文件(如本例中的.o文件)清理掉。

            (4) 对于make命令中出现的错误或警告,一定要尽量改动。

     

            无论是Windows下的程序猿也好,还是Linux下的程序猿也罢,一定要对makefile有一定的了解,这能够从側面反映一个程序猿的专业程度。

     

     

     

    (欢迎訪问南邮BBS:http://bbs.njupt.edu.cn/)
    (欢迎訪问重邮BBS:http://bbs.cqupt.edu.cn/nForum/index)

    (本系列文章每周更新两篇,敬请期待!

    本人微博:http://weibo.com/zhouzxi?topnav=1&wvr=5。微信号:245924426。欢迎关注!)

  • 相关阅读:
    C#中的 Attribute 与 Python/TypeScript 中的装饰器是同个东西吗
    如何用一个插件解决 Serverless 灰度发布难题?
    Seata 与三大平台携手编程之夏,百万奖金等你来拿
    函数计算异步任务能力介绍 任务触发去重
    混沌工程平台 ChaosBladeBox 新版重磅发布
    消息队列 RabbitMQ 遇上可观测业务链路可视化
    直播预告 | 容器服务 ACK 弹性预测最佳实践
    Serverless 在阿里云函数计算中的实践
    解密函数计算异步任务能力之「任务的状态及生命周期管理」
    可观测|时序数据降采样在Prometheus实践复盘
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5109664.html
Copyright © 2020-2023  润新知