【Linux篇】Linux项目自动化构建工具-make/Makefile

news2025/1/20 3:57:06

💛不要有太大压力🧡
💛生活不是选择而是热爱🧡

在这里插入图片描述

💚文章目录💚

    • 什么是make/Makefile
    • makefile
      • 认识makefile
      • makefile的编写
      • 伪目标
    • Linux下多程序编译

什么是make/Makefile

在实际工作中,一个项目可能有很多源文件,比如有200个源文件,那么用gcc/g++编译的时候,我们应该先编译哪一个呢?

而且,这么多源文件需要我们一个个去gcc来编译吗?

而makefifile就定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作

makefifile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编

译,极大的提高了软件开发的效率。

makefifile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编

译,极大的提高了软件开发的效率。

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

所以,总结一下:

make是一条命令

makefifile是一个文件,两个搭配使用,完成项目自动化构建。

而makefile文件需要我们自己去编写(一般工作中是使用一些自动化构造makefile的工具,比如cmake)

makefile

认识makefile

Makefile的主要作用就是为了自动化构建项目,也就是把源代码自动编译形成可执行文件。

(makefile 或 Makefile都可以 )

Makefile中主要由两个部分构成

  1. 依赖关系:相当于谁依赖谁
  2. 依赖方法:如何依赖的(通过依赖方法形成目标文件)

举个例子:

到月底了,你给你爸打电话要钱:

  1. 爸,我是你儿子(女儿) - - – --> 依赖关系
  2. 该给我钱了 -----> 依赖方法

makefile的编写

首先创建Makefile文件,用vim打开

touch Makefilevim Makefile

mytest:test.c    #要生成的mytest依赖test.c
	gcc test.c -o mytest  ##依赖方法(前面必须有tab缩进)

然后执行make 就是去调用Makefile的依赖方法,此时就会生成可执行文件mytest

注意问题

  • 创建的文件只能是:makefile或者Makefile (不能是其他的名字)

  • 如果出现makefile is up to date的报错,说明此时目录中存在一个mytest的文件(以上面代码为例)

    所以要更改生成的目标可执行程序的名字

项目除了构建,还需要清理

所以还需要构建一个删除的方法

mytest:test.c
	gcc test.c -o mytest 
.PHONY:clean   #表明clean是一个伪目标
clean:   #可以不依赖任何文件
	rm -f mytest   #删除命令
	
# mytest 和 clean都是一个目标文件
# 但是clean用 关键字.PHONY修饰,表明clean是一个伪目标(假的),即clean不是真实存在的.
# 可以理解成,伪目标主要就是用来执行下面的方法的

注意:在Makefile中,.PHONY后面的target表示的是一个伪造的target, 而不是真实存在的文件target,注意Makefile的target默认是文件。

然后make clean就可以清理生成的目标文件mytest

这样,就可以利用makemake clean

代替gcc test.c -o mytestrm -f mytest

所以 make 目标名就是去调对应的依赖方法

注意点

  1. 一个命令只会使用一对依赖关系和依赖方法,比如make对应一对依赖关系和依赖方法,make clean对应另一对依赖关系和依赖方法

  2. 默认make是执行第一对依赖关系和依赖方法

  3. 除了第一对直接用make,执行别的方法是make 目标名就会执行对应的方法

    如:clean就是目标名,所以有make clean执行clean方法

  4. 一般把要生成的可执行程序放在最前面

伪目标

伪目标的依赖方法总是被执行的

什么意思?

我们知道,如果make生成了一个mytest,然后继续调用make

就会提示错误信息,如图

image-20220728200644157

意思就是,生成的mytest已经是最新了,不需要再创建了

但是,如果执行了make clean之后,再执行多次,仍是可以执行的,如图

image-20220728200751825

所以,这就叫做:伪目标的依赖方法总是被执行的

意思就是:总是会根据依赖关系,执行依赖方法

所以,如果给我们要生成的可执行文件用.PHONY修饰,这样要升到文件也是伪目标文件,每一次调用make都会重新生成新的mytest

习惯:总是给clean设置.PHONY,不给要生成的可执行文件设置.PHONY

但是这里存在一个问题:

如果对文件做修改,就会成功执行make。但是如果不做修改,就会出现上面的 is up to date的问题

(注意经过配置的vim打开文件即使不做任何修改就退出,会自动保存,也就是对文件进行了修改)

那makefile是如何得知,得到的可执行程序是最新的呢?

---- 根据文件的最近修改时间

[[acm–Linux下文件的三个时间]]

ccess time: 表示最后一次访问文件的时间(仅仅是访问如cat,没有改动)

modify time: 表示最后一次修改文件的时间(修改内容)

change time: 表示最后一次对文件属性改变的改变的时间,包括权限、大小、属性等等

解释:

因为可执行程序一定是再源文件之后生成的,如果可执行程序的最后修改时间比所有源文件都靠后,那么说明可执行程序就是最新的,不需要修改。如果存在某一个源文件的最近修改时间按是在可执行程序的最后修改时间之后,说明可执行程序不是最新的,就可以修改

所以会出现以下情形:

我在vs2019写了一个代码,然后编译不通过

我发现错误,并修改(但是没有保存)

重新编译,结果还是不通过

这是因为编译生成的还是老的那个文件,没保存意味着源文件的最新修改时间没变,所以不会生成最新的可执行程序

Linux下多程序编译

创建main.ctest.ctest.h

我们知道生成可执行程序之前.h已经被编译器自动包含,最后一步链接其实是把所有的.o文件以及libc.so(动态库)合并链接,然后生成一个可执行文件。所以利用该过程即可实现多个文件编译生成可执行文件

(只需要合并.o文件,标准库编译器会自动链接)

mytest:main.o test.o  #文件列表空格隔开不同文件
	gcc -o mytest test.o main.o #此时没有.o会自动向下扫描依赖关系并执行依赖方法
test.o:test.c  #test.c是test.o的依赖文件
	gcc -o test.o -c test.c
main.o:main.c  #main.c是main.o的依赖文件
	gcc -o main.o -c main.c
#清理
.PHONY:clean
clean:
	rm -f *.o mytest  # 把所有目标文件和 mytest都清理

上面的代码 其实就相当于VS下Debug模式中 生成解决方案 和 清理解决方案

✨感谢阅读~ ✨
❤️码字不易,给个赞吧~❤️

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1455259.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在职阿里6年,一个28岁女软件测试工程师的心声

简单的先说一下,坐标杭州,16届本科毕业,算上年前在阿里巴巴的面试,一共有面试了有6家公司(因为不想请假,因此只是每个晚上去其他公司面试,所以面试的公司比较少) 其中成功的有4家&am…

芯片的分类

目录 通用处理器数字信号处理器专用处理器 通用处理器 我们常听说的中央处理器CPU就是一种典型的通用处理器(GPP)。这种处理器多使用片上系统(SoC)的设计理念,在处理器上集成各种功能模块,每一种功能都是用…

Python爬虫详解(一看就懂)

爬虫 爬虫是什么 爬虫简单的来说就是用程序获取网络上数据这个过程的一种名称。 爬虫的原理 如果要获取网络上数据,我们要给爬虫一个网址(程序中通常叫URL),爬虫发送一个HTTP请求给目标网页的服务器,服务器返回数据…

thinkphp+vue企业产品展示网站f7enu

本文首先介绍了企业产品展示网站管理技术的发展背景与发展现状,然后遵循软件常规开发流程,首先针对系统选取适用的语言和开发平台,根据需求分析制定模块并设计数据库结构,再根据系统总体功能模块的设计绘制系统的功能模块图&#…

三防平板电脑丨亿道工业三防平板丨三防平板定制丨机场维修应用

随着全球航空交通的增长和机场运营的扩展,机场维护的重要性日益凸显。为确保机场设施的安全和顺畅运行,采取适当的措施来加强机场维护至关重要。其中,三防平板是一种有效的工具,它可以提供持久耐用的表面保护,使机场维…

基于Java+Jsp的超市积分管理系统

🍅文末获取源码联系🍅 👇🏻 精彩项目推荐订阅👇🏻 不然下次找不到哟 感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮…

300分钟吃透分布式缓存-01讲:业务数据访问性能太低怎么办?

这节课主要讲缓存的基本思想、缓存的优点、缓存的代价三个部分。 缓存的定义 先来看下缓存的定义。 & 缓存最初的含义,是指用于加速 CPU 数据交换的 RAM,即随机存取存储器,通常这种存储器使用更昂贵但快速的静态 RAM(SRAM&…

lv15 input子系统框架、外设驱动开发 5

一、input子系统基本框架 在我们日常的Linux系统中,存在大量的输入设备,例如按键、鼠标、键盘、触摸屏、摇杆等,他们本身就是字符设备,linux内核将这些字符设备的共同性抽象出来,简化驱动开发建立了一个input子系统。 …

Springboot+vue的物流管理系统(有报告)。Javaee项目,springboot vue前后端分离项目

演示视频: Springbootvue的物流管理系统(有报告)。Javaee项目,springboot vue前后端分离项目 项目介绍: 本文设计了一个基于Springbootvue的前后端分离的物流管理系统,采用M(model)…

【COMP337 LEC 5-6】

LEC 5 Perceptron &#xff1a; Binary Classification Algorithm 8 感应器是 单个神经元的模型 突触连接的强度取决于接受外部刺激的反应 X input W weights a x1*w1x2*w2....... > / < threshold Bias MaxIter is a hyperparameter 超参数 which has to be chosen…

Android系统app开发

Android系统app开发 系统app阔以使用很多系统源码中隐藏的api 首先先编译出jar包 整编源码后&#xff0c;在这个目录下&#xff0c;这个就是包含系统源码隐藏api的jar包 系统app的标志 拷贝jar文件到app模块下 在编译之前把这个jar添加到classpath路径里面去&#xff0c;这样…

【机构vip教程】Selenium(2):selenium IDE工具

Selenium IDE工具&#xff1a; 该工具是一个用于构建脚本的初级工具&#xff0c;其实是FireFox的一个插件&#xff0c;拥有一个易于使用的界面。它拥有记录功能&#xff0c;能够记录用户执行的操作&#xff0c;并可以导出为可重复使用的脚本。如果没有编程经验&#xff0c;也可…

JAVA常见IO模型 BIO、NIO、AIO总结

BIO Blocking IO 同步阻塞型IO。当系统进行IO读写的时候&#xff0c;会阻塞&#xff0c;直到IO读写完毕。比如调用系统Read后&#xff0c;需要将内核空间的数据读取到用户空间。需要等待内核空间 数据准备&#xff0c;数据就绪&#xff0c;拷贝数据&#xff0c;线程一直处于阻…

Java面试第一站:计算机网络基础知识

该系列会持续更新&#xff0c;关注我&#xff0c;第一时间获取我的最新动态哟 Java面试中&#xff0c;经常会问到跟计算机网络知识相关的考点&#xff0c;有的小伙伴不是很明白。考察网络知识有什么意义&#xff1f; 因为编程的时候&#xff0c;多数的情况下是不用我们来编写 …

微前端(qiankun)vue3+vite

目录 一、什么是微前端 二、主应用接入 qiankun 1.按照qiankun插件 2.注册微应用引用 3.挂载容器 三、微应用接入 qiankun 1.vite.config.ts 2.main.ts ps&#xff1a;手动加载微应用方式 ps&#xff1a;为什么不用 iframe 一、什么是微前端 微前端是一种多个团队通过独…

探索API测试的奇妙世界:总结与思考!

本文主要是关于 API 测试的方法论探讨。 什么是 API 测试&#xff1f; API 测试是一种软件测试&#xff0c;涉及验证和确认应用程序接口 ( API ) 及其与其他服务组件的交互。测试重点关注软件架构的业务逻辑层&#xff0c;确保API按预期运行、数据准确交换、服务在各种条件下…

嵌入式调试工具之GDB

在单片机开发中&#xff0c;我们可以通过集成式的IDE 来进行调试&#xff0c;比如 MDK、IAR 等。 GDB 工具是 GNU 项目调试器&#xff0c;基于命令行使用。和其他的调试器一样&#xff0c;可使用 GDB工具单步运行程序、单步执行、跳入/跳出函数、设置断点、查看变量等等&#…

SHERlocked93 的 2023 年终总结

工作之后感觉一年一年过的太快&#xff0c;没有个记录连回忆都无从回忆起&#xff0c;之前的年终总结&#xff1a; SHERlocked93 的 2022 年终总结SHERlocked93 的 2021 年终总结SHERlocked93 的 2020 年终总结SHERlocked93 的 2019 年终总结SHERlocked93 的 2018 年终总结SHER…

使用C++,实现高精度加减乘除法运算!

我的个人主页 {\large \mathsf{{\color{Red} 我的个人主页} } } 我的个人主页 我的专栏&#xff1a; \mathcal{{\color{Green} 我的专栏&#xff1a;} } 我的专栏&#xff1a; 《精选文章》《算法》《每日一道编程题》《高精度算法》 文章目录 前言高精度计算初始模版string 转…

【python】网络爬虫与信息提取--正则表达式

一、正则表达式 正则表达式是用来简洁表达一组字符串的表达式。是通用的字符串表达框架&#xff0c;简洁表达一组字符串的表达式&#xff0c;针对字符串表达“简洁”和“特征”思想的工具&#xff0c;判断某字符串的特征归属。 用处&#xff1a;表达文本类型的特征&#xff1b;…