首页 > 系统相关 >【Linux】————Makefile编写

【Linux】————Makefile编写

时间:2024-09-02 12:50:24浏览次数:7  
标签:文件 依赖 mytest Makefile 编译 Linux test 编写

 9efbcbc3d25747719da38c01b3fa9b4f.gif

                                                      作者主页:     作者主页

                                                      本篇博客专栏:Linux

                                                      创作时间 :2024年9月1日

9efbcbc3d25747719da38c01b3fa9b4f.gif

1.GCC常见命令

1.1 查看gcc版本号

1.2 GCC输出目标文件

可以使用gcc code.c -o code用于输出目标文件

1.3 编译流程

GCC编译器的编译流程是:预处理、编译 、汇编和链接。预处理 就是展开所有的头文件、
替换程序中的宏、解析条件编译并添加到文件中。编译是将经过预编译处理的代码编译成汇编代码,也就是我们常说的程序编译。汇编就是将汇编语言文件编译成二进制目标文件。链接就是将汇编出来的多个二进制目标文件链接在一起,形成最终的可执行文件,链接的时候还会涉及到静态库和动态库等问题。

2.Makefile简单的编写

Makefile主要由两部分组成:a.依赖关系,b.依赖方法
我们举个例子:

你在学校,然后给你爸打电话,电话通了之后你说: "爸,我是你儿子",然后就直接挂了.

这样你就表明了依赖关系,我们是父子关系,但是后面什么都没有说了,你爸爸以为你遇到了什么危险.

这个时候你又打过去了说:“孩子没钱了,打点生活费吧",此时这个便才是依赖方法.

所以我们Makefile要达成一个目的,必须要满足这两个条件.

我们举个实际代码的例子来理解:

我们直接

vim Makefile

此时便会创建一个Makefile文件并且打开.

假设此时有一个test.c源文件,我们想编译成mytest可以执行文件.

依赖关系:

mytest:test.c

其中mytest称作目标文件,test.c称作依赖文件.

依赖方法:

必须第依赖关系的下一行,以Tab键为空开始写.

编译源文件,需要用到gcc,之前所讲过的.

         gcc test.c -o mytest 

这样一个简单的Makefile文件便写好了.

 从vim中退出来,编写一个简单的test.c文件:

此时目录下会有两个我们刚才创建的文件:Makefile和test.c

我们直接执行make命令:

我们发现执行命令之后,有了我们想要的mytest可执行文件,然后再./执行这个文件,发现程序成功运行了.

3. .PHONY

那如果我们想清理某个文件,该怎么写呢?既然是清理文件那还需要依赖什么文件删除吗?

这个时候需要用一个东西叫 .PHONY伪目标.

因为我们clean目的是清除某些文件,而删除操作又不会需要依赖文件,所以会创建一个伪目标,相当于依赖这个伪目标,然后执行依赖方法.

格式如下:

1.先在前面写一个.PHONY:clean

2.第二行紧接着输入clean:

3.Tab键开头,然后输入依赖方法 rm -rf mytest

所以输入进去应该是这样:

然后我们使用一下它。退出vim,执行make clean

 我们发现mytest文件被删除了.

还有一个作用就是总是被执行.

什么叫总是被执行呢?先来看如果我们一直make会发生什么呢?

可以发现这里的意思是说mytest已经是最新了.但是我就是想让它每次都执行,这个时候你在前面加上.PHONY即可:

然后退出,便可以每次都被执行了.

 这里有一个问题:

问题:

如果只执行make,它执行的是Makefile里哪一段语句呢?

默认是执行第一个依赖关系和依赖方法.

默认是执行第一个依赖关系和依赖方法.

我们第一个写的是gcc编译的,第二个才是clean,所以我们直接执行make是将test.c源文件编译成mytest可执行文件.

为了验证,我们可以交换一下两个的顺序:

退出vim, 此时我们执行make,发现执行的语句成为了rm

想要编译,需要自己手动输入:make mytest.

此时便编译完成,生成了一个可执行文件.

 还是紧接着上面的,它是

怎么知道我的可执行程序是最新的呢?

根据文件的最近修改时间

这里有一条命令stat,它可以查看一个文件的重要的三个时间!

Access:最近的访问时间.

Modify: 最近的内容修改时间,比如你修改了文件的内容,这个时间就会改变.

Change:最近的属性修改时间,比如你修改了这个文件的读写权限,这样它的属性修改时间就会被修改.

我们知道一个文件是由内容+属性组成.如果内容被修改,那么文件的大小也会被修改,相应的属性修改时间也会改变,所以这点也要注意.

那是如何判断的呢?可执行文件形成的时间一定要晚于源文件。这点是大家可以理解的,因为可执行文件是由源文件编译生成的.

所以只需要比较两者的时间,只要可执行文件的时间一直比源文件晚(新),就说明这个可执行文件一直是最新的.

我们如果修改源文件,此时源文件的时间就一定会比可执行文件新,这个时候再次可以执行gcc便可以编译了.

如果有多个文件,我们该如何使用Makefile编写呢?

Makefile编译多个文件

首先创建一个test.h文件,用于声明:

再将test.c文件里内容做修改如下:

再创建一个main.c用于执行.

在编写Makefile时,我们习惯于把依赖文件写成.o的形式.而.o又需要.c来编译。所以Makefile会自动向下寻找这些编译语句,我们只要写上编译的语句即可. 

进度条小程序

vim pro.c,进入pro.c,然后输入代码:

    #include<stdio.h>                                                                                                                                                                                          
    #include<string.h>
    #include<unistd.h>
    
    #define NUM 102 
    int main()
    {
      char bar[NUM];
      memset(bar,0,sizeof(bar));
      int cnt = 0;
      const char* lable = "|/-\\";
      while(cnt <= 100)
      {
        printf("[%-100s][%d%] %c\r",bar,cnt,lable[cnt%4]);
        bar[cnt++]='#';
        fflush(stdout);
        usleep(30000);
      }
      printf("\n");
    }

 vim Makefile,在Makefile下输入:

pro:pro.c
    gcc -o pro pro.c
 
.PHONY:clean
clean:
    rm -rf pro  

然后推出make编译输出即可

最后:

十分感谢你可以耐着性子把它读完和我可以坚持写到这里,送几句话,对你,也对我:

1.一个冷知识:
屏蔽力是一个人最顶级的能力,任何消耗你的人和事,多看一眼都是你的不对。

2.你不用变得很外向,内向挺好的,但需要你发言的时候,一定要勇敢。
正所谓:君子可内敛不可懦弱,面不公可起而论之。

3.成年人的世界,只筛选,不教育。

4.自律不是6点起床,7点准时学习,而是不管别人怎么说怎么看,你也会坚持去做,绝不打乱自己的节奏,是一种自我的恒心。

5.你开始炫耀自己,往往都是灾难的开始,就像老子在《道德经》里写到:光而不耀,静水流深。

最后如果觉得我写的还不错,请不要忘记点赞✌,收藏✌,加关注✌哦(。・ω・。)

愿我们一起加油,奔向更美好的未来,愿我们从懵懵懂懂的一枚菜鸟逐渐成为大佬。加油,为自己点赞!

标签:文件,依赖,mytest,Makefile,编译,Linux,test,编写
From: https://blog.csdn.net/bhbcdxb123/article/details/141790342

相关文章

  • Linux驱动开发基础(DS18B20温度模块)
    所学来自百问网目录1.DS18B20简介2.硬件设计3.软件设计3.1 存储器介绍3.2 通信时序3.2.1初始化时序3.2.2写时序3.2.3 读时序3.3常用命令4.示例代码4.1驱动代码4.2应用代码4.3Makefile4.4实验效果1.DS18B20简介DS18B20温度传感器具有线路简单......
  • Linux驱动开发基础(IRDA 红外遥控模块)
    所学来自百问网 目录1.红外遥控简介2.硬件设计3.软件设计4.示例代码4.1驱动代码4.2Makefile4.3实验效果1.红外遥控简介红外遥控被广泛应用于家用电器、工业控制和智能仪器系统中,像我们熟知的有电视机盒子遥控器、空调遥控器。红外遥控器系统分为发送端和接收......
  • Linux系统添加软件快捷方式 (图标)
    Linux系统添加软件快捷方式(图标)背景在Linux系统下安装软件,安装软件后,常常缺少软件的快捷方式,不熟悉Linux系统的同学甚至不知道软件安装的位置,就算知道软件安装位置的同学也会因打开点开一大堆文件夹而头疼,因此,在Linux系统性为常用软件添置快捷方式显得尤为重要。具体方法方法......
  • Linux中 awk命令根据列的索引批量提取列的数据
     001、[root@PC1test]#lsa.txtidx.txt[root@PC1test]#cata.txt0010020030040050060070080090100110120130140150160170180190200210220230240250260270280290300310320330340350360370380390400410420430440450460......
  • 安全:linux用户和组
    一,用户组所在文件:/etc/group二,查看当前登录用户所属的组1,groups[root@blog~]#groupsroot2,id[root@blog~]#iduid=0(root)gid=0(root)groups=0(root)3,lid[root@blog~]#lidNousernamespecified,usingroot.root(gid=0)三,查看指定用户所属的组1,group[r......
  • Red Hat 9 — Red Hat 9.4Linux系统 虚拟机安装【保姆级教程】
    Mac分享吧文章目录效果一、下载软件二、安装软件与配置1、安装2、配置三、查看基本信息安装完成!!!效果一、下载软件下载软件地址:www.macfxb.cn二、安装软件与配置1、安装2、配置三、查看基本信息安装完成!!!......
  • 2024 年 13 个适用于 Linux 的最佳照片图像编辑器
      2024年13个适用于Linux的最佳照片图像编辑器   在本文中,我回顾了各种Linux发行版上可用的一些最佳照片编辑软件。这些不是唯一可用的照片编辑器,但却是Linux用户最流行和最常用的照片编辑器之一。1.GIMP首先,在列表中,我们有 GIMP,一个免费、开源、跨平台......
  • Linux高级命令(扩展)
    Linux高级命令(扩展)一、find命令1、find命令作用在Linux操作系统中,find命令主要用于进行文件的搜索。2、基本语法#find搜索路径[选项选项的值]...选项说明:-name:根据文件的名称搜索文件,支持*通配符-type:f代表普通文件、d代表文件夹案例:搜索计算机中的所有文件,然后找......
  • .Net 5.0 WebAPI 发布至 Linux 系统
    阅读目录〇、前言一、Linux环境准备1.1CentOS7.x在线安装.net5.01.2CentOS8.x在线安装.net5.01.3查看是否安装成功二、示例项目创建和发布2.1创建一个测试项目2.2发布步骤三、服务开启和配置自启动3.1服务开启3.2将服务配置为系统自启动......
  • 安徽省专业技术人员继续教育培训平台刷课脚本-JavaScript编写
    脚本学习网站:安徽省专业技术人员继续教育公需课培训平台jxjy.ahhjsoft.com/index脚本地址:安徽省专业技术人员继续教育公需课培训平台-刷课脚本教程1.插件安装(以MicrosoftEdge浏览器为例)打开最中间那个蓝色绿色的浏览器,谷歌之类的浏览器也可以点击屏幕右上角三个点,图......