[Linux] 项目自动化构建工具-make/Makefile

标题:[Linux] 项目自动化构建工具-make/Makefile

@水墨不写bug



目录

一、什么是make/makefile

二、make/makefile语法

补充(多文件标识):

三、make/makefile原理

四、make/makefile根据时间对文件选择操作


正文开始:

一、什么是make/makefile

        在Linux下,一切皆文件。在实现大型项目的时候,通常来说,源文件按照其模块、功能、类型放在若干的目录中,难道我们需要把这些文件一一编译再链接吗?为了提高效率,make/makefile就出现了。

        makefile可以按照我们写好的规则来完成自动化编译,一旦项目内容有修改,仅需几条指令,就可以实现整个工程的完全自动化编译,这极大对提高了软件开发的效率。

一句话定义make/makefile:make是一个指令;makefile是一个文件

        我们要做的就是在makefile中编写相关的指令,可以说是提前写好的脚本,当我们需要的时候,再执行相关的命令。 

二、make/makefile语法

        makefile怎么写?

        首先,在执行命令之前,需要表明依赖关系。什么是依赖关系?可以简单的理解为一个文件的生成需要另一个文件存在。

        然后,需要说明依赖方法。 依赖方法就是用命令表明要做的事。

表明依赖关系:在一行的开头写 目标生成文件 +:(冒号)+依赖的文件

        比如:mytest文件需要依赖test.c,则需要表明依赖关系:

mytest:test.c 

        紧接着在下一行,开始需要加一个 “tab”字符,必须是“tab”,其他的都不行。在其后加上依赖方法。这里的依赖方法就是用test.c生成mytest的指令:

gcc -o mytest test.c

 现在,我们已经完成了生成项目,接下来还需要清理项目。清理项目仍然需要用到依赖关系。

        我们一般把清理项目的指令设为clean,由于clean不依赖任何文件,所以:(冒号)的右侧不写任何文件:

clean:

        同样的,在下一行开头“tab”,其后加上依赖方法:

rm -r mytest

         到这里,我们就完整实现了一个简单的makefile。


整体的makefile如下:

mytest:test.cgcc -o mytest test.c
clean:rm -r mytest

        在完整实现makefile之后,我们就可以在含有makefile的目录下使用make命令:

make

        make命令会根据依赖关系的依赖方法,从而令makefile文件的内容而生成mytest;

        如果想要清理mytest,使用命令:

make clean

        make clean会根据 依赖方法,清除mytest。

补充(多文件标识):

        如果一个文件有多个依赖文件,则在“:”后面以此写上文件名即可,文件之间用一个空格分开。而在表明依赖方法的时候,就不必再一个一个写文件名称了,可以用简写标识:

$@   :标识 “:”左侧的目标文件

$^     :标识“:”右侧的所有依赖文件

于是,针对多依赖文件的依赖关系就可以这样写:

gcc -o $@ $^

三、make/makefile原理

        1. make会在当前目录下找名字叫“Makefile”或“makefile”的文件。(首字符不区分大小写)

        2. 如果找到,它会找文件中的第一个目标文件(target),一般来说,我们会把目标文件(最终文件)放在第一个位置,然后倒推生成目标文件需要依赖的其他文件,一直推到已存在的文件为止。

比如下面这个makefile例子:

my_test:my_test.og++ -o my_test my_test.o
my_test.o:my_test.sg++ -c my_test.s -o my_test.o
my_test.s:my_test.ig++ -S my_test.i -o my_test.s
my_test.i:test.cppg++ -E test.cpp -o my_test.i

       我们首先发现目标文件my_test,其依赖文件为my_test.o,而my_test.o又依赖my_test.s,但是还没有推到已知的test.cpp,所以要继续寻找;my_test.s依赖my_test.i,而my_test.i就可以由test.cpp生成,test.cpp是已经存在的文件,所以推导结束,并且没有推导过程中的逻辑中断,所以上述的makefile文件是正确的。

        在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。

        这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。(这有点像一个堆栈的过程)

四、make/makefile根据时间对文件选择操作

        当我们在一个项目中make一次之后,再次make,会发现出现这样的错误:

        这个名字叫做“processbar”的项目已经是最新的了。想要理解为什么会发生这样的错误,我们需要理解每一个文件都有三个时间:

Access time

Modify time

Change time

        这三个时间分别是:最后一次访问文件的时间, 最后一次修改文件内容的时间,最后一次修改文件属性的时间。

访问文件:这比较好理解,比如读取文件,打开文件看文件的内容等;

修改文件:

        修改文件分为修改文件的内容修改文件的属性。我们知道,文件有内容(就是我们通常写入的数据)和属性(比如文件的大小,创建时间,文件类型,所有者等)。

        make会根据项目最终文件和源文件的最近修改时间来决定是否要重新编译生成项目文件:

        如果项目最终文件的修改时间比源文件的时间晚,那么说明源文件在编译生成项目文件之后没有修改过,这时make就会出现上述的报错;如果项目最终文件的修改时间比源文件早,那么说明源文件在编译生成项目文件之后源文件修改过,这时make就可以重新编译生成项目文件。

        如果想要不受上述的时间的限制,从而实现在每次make之后都重新编译生成项目文件,我们就需要定义伪目标

        具体的操作为在表明依赖关系之前用 ".PHONY"修饰目标文件。

        一般而言,我们一般不会把最终项目定义为伪目标,一般选择把clean定义为伪目标,这样一来,在每次想要clean的时候,总是可以成功执行clean:

修改后的makefile:

processbar:processbar.c main.c                                                                                      gcc -o $@ $^
.PHONY:clean
clean:rm -f processbar

完~

未经作者同意禁止转载

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在安卓和Windows下使用Vizario H264 RTSP

Unity2021.3.35f1,运行模式为ENGINE_SERVER 1.环境设置 Windows设置 安卓设置 2.代码修改 ConnectionProperties中的server必须与真实IP一样,所以需要新增一个获取IP的函数 public string GetLocalIPAddress(){IPHostEntry host;string localIP &quo…

codesys进行控制虚拟轴运动时出现的一些奇怪bug的解释

codesys进行控制虚拟轴运动时出现的一些奇怪bug的解释 问题描述第一个奇怪的bug:新建的工程没有SoftMotion General Axis Pool选项第二个奇怪的bug:在新建工程SoftMotion General Axis Pool选项时,无法手动添加第三个奇怪的bug:虚…

Postgresql碎片整理

创建pgstattuple 扩展 CREATE EXTENSION pgstattuple 获取表的元组(行)信息,包括空闲空间的比例和行的平均宽度 SELECT * FROM pgstattuple(表名); 查看表和索引大小 SELECT pg_relation_size(表名), pg_relation_size(索引名称); 清理碎片方…

如何进行 AWS 云监控

什么是 AWS? Amazon Web Services(AWS)是 Amazon 提供的一个全面、广泛使用的云计算平台。它提供广泛的云服务,包括计算能力、存储选项、网络功能、数据库、分析、机器学习、人工智能、物联网和安全。 使用 AWS 有哪些好处&…

AI预测体彩排3采取888=3策略+和值012路或胆码测试9月4日升级新模型预测第72弹

经过70多期的测试,当然有很多彩友也一直在观察我每天发的预测结果,得到了一个非常有价值的信息,那就是9码定位的命中率非常高,已到达90%的命中率,这给喜欢打私菜的朋友提供了极高价值的预测结果~当然了,大部…

亚信安全信立方安全大模型荣获“磐石·Y”大模型安全评定

2024年4月,在中国软件评测中心(工业和信息化部软件与集成电路促进中心)联合数据安全关键技术与产业应用评价工业和信息化部重点实验室、中国计算机行业协会数据安全专业委员会开展的大模型安全性测评“磐石X”榜单计划中,亚信安全…

PTA L1-041 寻找250

L1-041 寻找250(10分) 对方不想和你说话,并向你扔了一串数…… 而你必须从这一串数字中找到“250”这个高大上的感人数字。 输入格式: 输入在一行中给出不知道多少个绝对值不超过1000的整数,其中保证至少存在一个“2…

Java_jdk安装配置~java入门

目录 0.总体介绍 1.入门介绍 2.官网 3.关于版本的问题 4.环境变量配置 5.编码修改 6.创建项目 0.总体介绍 下面的这个情况比较复杂,因为遇到了一些别人没有遇到的问题,我会把自己遇到这个问题,到解决这个问题的过程尽可能详细的展示出…

Qt 字符串的编码方式,以及反斜杠加3个数字是什么编码\344\275\240,如何生成

Qt 字符串的编码方式 问题 总所周知,Qt的ui文件在编译时,会自动生成一个ui_xxxxx.h的头文件,打开一看,其实就是将摆放的控件new出来以及布局的代码。 只要用Qt提供的uic.exe工具,自己也可以将ui文件输出为代码文件…

设计模式 —— 单例模式

文章目录 一、单例模式1.1 单例模式定义1.2 单例模式的优点1.3 单例模式的缺点1.4 单例模式的使用场景 二、普通案例2.1 饿汉式单例模式(Eager Initialization Singleton)2.2 懒汉式单例模式(Lazy Initialization Singleton) 参考资料 本文源代码地址为 java-demos/singeleton-…

Leetcode236经典题目二叉树的最近公共祖先

本次为大家带来的题目是leetcode236二叉树的最近公共祖先 本道题的直观思路是自底向上进行寻找,如果存在的话那么向上返回,如何能够自底向上遍历呢?我们可以利用回溯进行处理,那么需要注意的是进行回溯的时候一定要使用后序遍历来…

too many blocks in cooperative launch at cudaLaunchCooperativeKernel

在使用cudaLaunchCooperativeKernel时出现: cudaErrorCooperativeLaunchTooLarge (error 82) due to “too many blocks in cooperative launch” on CUDA API call to cudaLaunchCooperativeKernel. 问题: 在使用cudaLaunchCooperativeKernel时&…

总线操作与定时

目录 一. 总线定时1.1 同步通信(同步定时方式)1.2 异步通信(异步定时方式)1.3 半同步与分离式通信(了解即可) 二. 总线标准(了解即可)2.1 总线标准的概念2.2 系统总线标准2.3 局部总…

新电脑Win11系统想要降级为Win10怎么操作?

前言 现在的电脑大部分都是Windows 11系统,组装机还好一些,如果想要使用Windows 10,只需要在安装系统的时候选择Windows 10镜像即可。 但是对于新笔记本、厂商的成品机、一体机来说,只要是全新的电脑,基本上都是Wind…

Windows中Git对文件名大小写不敏感的问题解决方法

文章目录 前言一、Git 对文件名大小写不敏感方法1.使用git命令进行修改方法2.关闭git 忽略大小写配置 (可以当前项目设置,也可以全局设置 --global) 二、新的问题(重复的目录)原因分析解决方法 前言 Git是一个免费的、…

C#使用MQTT(一):MQTT服务端

MQTT(Message Queuing Telemetry Transport) 即时通讯协议, 开发商 IBM MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状…

【图论】Dijkstra算法求最短路

一、Dijkstra算法简介 Dijkstra算法是由河南荷兰计算机科学家狄克斯特拉(Dijkstra)于1959年提出的,因此又叫狄克斯特拉算法。 二、初识Dijkstra算法 在使用Dijkstra算法求最短路时,需要用到三个辅助数组: v i s x vis_x visx​:布尔数组&…

【图灵完备 Turing Complete】游戏经验攻略分享 Part.3 存储器

这一章,前面不难,后面难。 教你别这么连线连出问题。 看结果说话,延迟两个时刻输出。 先不管要求,输出一个稳定的信号,看看之前给了延迟元件正好延迟一刻,然后作为输入和那个稳定的信号做一个逻辑运算改变…

国内可以免费使用的gpt网站【九月持续更新】

GPT Hub 是我最近使用的一款智能文本生成工具平台,它支持多种AI模型,包括最新的GPT-4模型,并且可以在国内网络环境中直接访问。以下是我在使用过程中发现的一些特点: 多功能支持:不仅支持代码生成,还涵盖了…

macos OneNote 2016 for Mac 官方pkg下载地址 - macos 10.15 Catalion 可用Onenote版本官方下载地址

macos 10.15 Catalion 版本的系统已经无法正常从应用商店下载到可用的Onenote 应用,原因是版本不受支持, 而且onenote官方链接的应用商店地址https://apps.apple.com/us/app/microsoft-onenote/id784801555?mt12在中国地区也无法访问, 所以中国地区用户如果想使用onenote应用…