【Linux操作系统】自动化编译make和Makefile

简介: 【Linux操作系统】自动化编译make和Makefile

一.make/makefile简介

1.什么是make,makefile?

make是一个构建C++项目的工具/命令;makefile是一个包含编译命令的脚本文件。通过make工具解释makefile文件中的命令,进行我们的项目编译。

2.为什么要有make/makefile?

Linux环境下开发,工程源文件较少时,可使用gcc直接编译;但当工程源文件较多时,gcc直接编译复杂(比如命令较多,文件的编译先后顺序确定问题等)且不易于后期项目的维护,因此采用make/makefile做到自动化编译,有益于项目开发。

二.makefile文件规则

1.基本规则

target:prerequisites
  command


makefile文件书写基本规则:

就像做好一道菜道,需要有其依赖的食材,还得依赖厨师的好厨艺!


04ec0512f7c18ddbd92c0ad19701e13e.png

目标:target,要生成的目标文件,往往是程序的中间文件或者最终的文件,比如test.i,test.s,test.o,test

依赖:prerequisites,目标文件由哪些文件生成,往往有的一个或多个

命令:command,通过执行该命令从依赖文件得到目标文件,需要注意命令前必须有一个[tab键],可以有多个命令,但是必须每个命令独占一行!

makefile中的[tab键]不可省略,更不可用空格代替,[tab键]不等于4个空格也不等于8个空格,1个tab键实际是4个字符,只不过代表的是4个字符.


2.举一个例子

Makefile文件如下:

ps:

  • makefile文件名也可叫:Makefile
  • makefile文件中注释用“#
test:test.c          #依赖关系
  gcc test.c -o test #依赖方法  
.PHONY:clean    
clean:    
  rm -rf test 


这个.PHOINY是什么东西?我待会会讲到

:wq!退出vim后我们怎么用好makefile文件呐?


58f6262b4900cc30e3aa7db6c1b58f97.png


3.伪目标


介绍伪目标前我们先讲一讲实目标的概念:


实目标:命令执行后真正要生成的文件名, test就是实目标


伪目标:命令执行后不会生成实际文件,常用于辅助操作, .PHONY是伪目标的标注符,clean是伪目标,不会生成实际名为clean的文件.


伪目标的特点:伪目标可以总是被执行[为什么后面讲]




4.其他规则


变量名 含义
$@ 目标文件,可表示test
$^ 所有的依赖文件,可表示test.c
$< 第一个依赖文件
test:test.c    
  @gcc $^ -o $@                                                                                                              
.PHONY:clean    
clean:    
  @rm -rf test

@: 不带@在命令行执行make的时候,会将所执行的命令回显到终端,带@则不回显


75a403a929e5d0d9474ded838b0760f2.png


为什么在命令行执行的时候,执行第一组依赖关系和依赖方法的命令是make,执行第二组依赖关系和依赖方法的命令却是make clean?


实际上,第一我们默认第一组依赖关系和依赖方法也可以写全成: make test


只不过我们规定第一组可以省略test,只写make


三.文件三个时间问题-make程序

1.三个时间何时更新

我们知道: 文件=文件内容+文件属性


通过stat + 文件名可以查看文件的状态:

[li@VM-8-5-centos 1-7]$ stat test.c
  File: ‘test.c’
  Size: 74          Blocks: 8          IO Block: 4096   regular file
Device: fd01h/64769d  Inode: 924282      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1002/      li)   Gid: ( 1002/      li)
Access: 2023-01-07 18:48:21.189648157 +0800
Modify: 2023-01-07 18:48:17.476581743 +0800
Change: 2023-01-07 18:48:17.476581743 +0800
 Birth: -

image.png

因为文件一定要被访问,才能完成文件内容的修改,所以Modify更新,Access一定也会更新

因为文件内容被修改,文件大小一定发生改变,所以Modify更新,Change一定也会更新

但是Access/Change改变并不会造成另外两个时间也改变

dd627e88ba2e8fdd88258b7127c52935.png

回顾一下文件属性:

Linux文件或目录的属性主要包括:文件或目录的节点、种类、权限模式、链接数量、所归属的用户和用户组、最近访问或修改的时间等内容。

-rw-rw-r-- 1 li li   62 Jan  7 18:47 Makefile
-rwxrwxr-x 1 li li 8360 Jan  7 20:55 test
-rw-rw-r-- 1 li li   74 Jan  7 18:48 test.c

2.touch的两个作用

我们知道touch命令可以创建一个文件,还有一个作用就是对现有文件更新这三个的时间为系统时间.

touch test//不带选项,atime,mtime,ctime都更新
touch test -a//atime更新
touch test -m//mtime更新
touch test -c//ctime更新

3.make程序如何知道依赖文件是否更新?

肯定是先有test.c再有test文件,这就意味着一开始, test.c的修改时间一定是比test的修改时间旧.


如果make程序发现test的最后一次修改时间居然比test.c的最后一次修改时间旧,那么说明test.c一定在test最后一次修改过后,又修改过,所以make的时候,就能将依赖方法执行成功,反之也成立!

7c6f01420266d6d22b34684cd5cf4cc7.png

到这里我们也能解释为什么.PHONY有一个特点:被.PHONY修饰的总是能被执行,那可能就是.PHONY修饰后不再通过比较test和test.c的修改时间来判断是否要重新编译!

目录
相关文章
|
7月前
|
存储 Linux API
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
在计算机系统的底层架构中,操作系统肩负着资源管理与任务调度的重任。当我们启动各类应用程序时,其背后复杂的运作机制便悄然展开。程序,作为静态的指令集合,如何在系统中实现动态执行?本文带你一探究竟!
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
|
6月前
|
存储 Linux iOS开发
【Linux】冯诺依曼体系与操作系统理解
本文深入浅出地讲解了计算机体系的两大核心概念:冯诺依曼体系结构与操作系统。冯诺依曼体系作为现代计算机的基础架构,通过中央处理器、存储器和输入输出设备协同工作,解决了硬件性能瓶颈问题。操作系统则是连接硬件与用户的桥梁,管理软硬件资源,提供运行环境。文章还详细解析了操作系统的分类、意义及管理方式,并重点阐述了系统调用的作用,为学习Linux系统编程打下坚实基础。适合希望深入了解计算机原理和技术内幕的读者。
151 1
|
2月前
|
监控 Linux 开发者
理解Linux操作系统内核中物理设备驱动(phy driver)的功能。
综合来看,物理设备驱动在Linux系统中的作用是至关重要的,它通过与硬件设备的紧密配合,为上层应用提供稳定可靠的通信基础设施。开发一款优秀的物理设备驱动需要开发者具备深厚的硬件知识、熟练的编程技能以及对Linux内核架构的深入理解,以确保驱动程序能在不同的硬件平台和网络条件下都能提供最优的性能。
118 0
|
4月前
|
Java 关系型数据库 MySQL
在Linux操作系统上设置JDK、Tomcat、MySQL以及J2EE后端接口的部署步骤
让我们总结一下,给你的Linux操作系统装备上最强的军队,需要先后装备好JDK的弓箭,布置好Tomcat的阵地,再把MySQL的物资原料准备好,最后部署好J2EE攻城车,那就准备好进军吧,你的Linux军团,无人可挡!
112 18
|
4月前
|
开发框架 关系型数据库 Java
Linux操作系统中JDK、Tomcat、MySQL的完整安装流程以及J2EE后端接口的部署
然后Tomcat会自动将其解压成一个名为ROOT的文件夹。重启Tomcat,让新“植物”适应新环境。访问http://localhost:8080/yourproject看到你的项目页面,说明“植物”种植成功。
124 10
|
3月前
|
NoSQL Linux 开发工具
Linux环境基础开发工具的使用(yum、vim、gcc、g++、gdb、make/Makefile)
本文介绍了yum 包管理工具、Vim 编辑器、gcc/g++ 编译器、gdb 调试器、编译原理及 Makefile 的使用,同时还配备了如何使用,以及图解。旨在帮助读者更好地理解和应用这些工具与技术。
152 0
|
7月前
|
NoSQL Unix Linux
Linux 操作系统的诞生与发展历程
步探索与准备: 1991年初,林纳斯·托瓦兹开始在一台386sx兼容微机上学习minix操作系统。通过学习,他逐渐不能满足于minix系统的现有性能,并开始酝酿开发一个新的免费操作系统。
215 8
Linux 操作系统的诞生与发展历程
|
10月前
|
安全 Linux 数据安全/隐私保护
Vanilla OS:下一代安全 Linux 发行版
【10月更文挑战第30天】
411 0
Vanilla OS:下一代安全 Linux 发行版
|
7月前
|
运维 自然语言处理 Ubuntu
OS Copilot-操作系统智能助手-Linux新手小白的福音
OS Copilot 是阿里云推出的一款操作系统智能助手,专为Linux新手设计,支持自然语言问答、辅助命令执行和系统运维调优等功能。通过简单的命令行操作,用户可以快速获取所需信息并执行任务,极大提升了Linux系统的使用效率。安装步骤简单,只需在阿里云服务器上运行几条命令即可完成部署。使用过程中,OS Copilot不仅能帮助查找命令,还能处理文件和复杂场景,显著节省了查找资料的时间。体验中发现,部分输出格式和偶尔出现的英文提示有待优化,但整体非常实用,特别适合Linux初学者。
368 10
|
8月前
|
弹性计算 自然语言处理 Ubuntu
OS Copilot-操作系统智能助手-Linux新手小白的福音
OS Copilot是由阿里云推出的操作系统智能助手,专为Linux新手设计,支持自然语言问答、辅助命令执行等功能,极大提升了Linux系统的使用效率。用户只需通过简单的命令或自然语言描述问题,OS Copilot即可快速提供解决方案并执行相应操作。例如,查询磁盘使用量等常见任务变得轻松快捷。此外,它还支持从文件读取复杂任务定义,进一步简化了操作流程。虽然在某些模式下可能存在小问题,但总体上大大节省了学习和操作时间,提高了工作效率。
278 2
OS Copilot-操作系统智能助手-Linux新手小白的福音