【Linux】Linux环境下如何实现自动化编译——make/makefile入门

news2024/12/29 9:42:39

文章目录

前言

一、make/Makefile 的使用

1.示例

2.编写 Makefile 文件

2.1生成

2.2清理

二、make 如何知道生成的可执行文件是否最新


前言

        在Linux 环境下编写好C语言代码之后,我们需要使用编译工具gcc 将其翻译为可执行文件。可是,如果对代码进行多次修改,每次修改完成,都需要重新使用 gcc 指令,会显得非常麻烦,所以可以使用 Linux 下的自动化构建工具 make/Makefile 。make是一条命令,Makefile是一个文件,两个搭配使用,完成项目自动化构建。
        此外,如果是写工程文件,那么一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,Makefile 定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。。

        与此同时,平时使用如 Visual Studio 2019 等 IDE,是可以对程序进行调试的。在Linux环境下,也有专门的调试器 —— gdb。可以实现类似于 VS 环境下的调试,单步执行,监视变量、进入函数等等。


一、make/Makefile 的使用

1.示例

        上面说过,make是一条命令,Makefile是一个文件。显然,就类似于 vim 的配置文件一样,Makefile里面定义了某些规则,当我们使用make指令的时候,就可以有选择性地调用这些规则,比如编译文件、删除文件等等。

        下面通过一个例子来更好地理解这个内容。如下,编写了一个打印 "Hello World" 的测试文件,和简单的Makefile。

        根据 Makefile 里面的内容可以大致猜到,起作用就是 编译test.c 文件,生成 test 这个可执行文件。
        我们来测试一下,如下,直接使用 make 指令。发现自动执行上文写好的依赖方法,然后查看,确实生成了 test 文件,执行正常。

2.编写 Makefile 文件

2.1生成

        如上,Makefile 里面第一行的内容,可以理解为:我要生成一个目标文件 test,其依赖于 test.c 。我们把这种关系称为依赖关系第二行的内容被称作是依赖方法,其定义了:如何通过 test.c 生成 test 。我们可以再小小总结一下:Makefile 是围绕依赖关系和依赖方法进行自动化编译的工具。

        那么,我们可不可以分步来生成 test 文件呢?自然是可以的,由于冒号左边是依赖于冒号右边,所以我们可以如下图这样写,test 依赖于 test.o , test.o 依赖于 test.s ,test.s 依赖于 test.i ; test.i 依赖于 test.c 。 

        实际上,只使用 make 指令的话,只会执行 Makefile 里面的第一个依赖关系和依赖方法。但是,上图中,第一个依赖关系是 test : test.o , 可是当前目录下并没有 test.o 文件,下面又有 test.o 依赖于 test.s ,所以还要寻找 test.s …… 一直这样下去,直到找到最后一个依赖关系——  test.i 依赖于 test.c ,test.c 是存在的,所以可以执行这个依赖方法,那么生成了test.i ,又可以执行上面的依赖方法……(依次执行上面的依赖方法。)

       上面一步步生成 test 文件只是做一个示例,为了初步了解 Makefile ,一般情况下,不推荐这样,还是推荐最开始那样,直接生成。

2.2清理

        有时,我们会需要删除文件,也可以使用 Makefile 配置实现自动化删除。如下图,配置Makefile 里面多了一个关于 clean的 依赖关系 和 依赖方法。其中,可以看到,clean:的右边是没有内容的,即 clean 不依赖于任何文件,这种写法是可以的。但是 clean:不可以去掉,否则不知道这个依赖方法是属于哪个依赖关系。至于多出来的 .PHONY:clean 是什么意思,下文会讲解。

        但是,在命令行里执行的时候,为什么不是使用 make 而是 make clean 呢?其实上文提到过一些,如果只使用 make 指令,那么就会执行第一组依赖关系和依赖方法。但是,这里clean是第二组依赖关系和依赖方法,所以要使用 make clean ,让它知道我们要使用的是 clean 这一组依赖关系和依赖方法。

        可是 Makefile 文件里面为什么会多了一行 .PHONY:clean 呢?.PHONY: 是一个关键字,在这里被用来修饰 clean。.PHONY: 的意思是说:clean 总是被执行的。直接根据字面意思来理解可能会十分困难,可以通过例子来理解。下图中,使用 make 指令,第二次的时候却被告知 test 文件已经是最新的了,所以无法构建。但是,有 .PHONY: 修饰的 clean ,却可以一直执行

        所以可以以此来总结:有 .PHONY: 修饰之后,该组依赖关系和依赖方法不会因为文件的性质(是否存在、是不是最新版的)而决定执不执行,只要命令行输入了,那么就一定会被执行。注意,.PHONY: 修饰的,一般被称作伪目标

        我们用 .PHONY: 修饰 test 之后,就可以一直执行了,但是正常不会这样写,因为如果代码很多,那么编译代码是非常耗时间的。


二、make 如何知道生成的可执行文件是否最新

        上文有提到,如果不适用 .PHONY: 修饰 test,那么第二次执行 make 指令的时候,会提示 test 文件已经是最新的了,make 是如何判别的呢?

        实际上,由于 test 依赖于 test.c ,所以是根据 test.c 最后修改时间 ,和 test 的生成时间来判断。如果 test.c 最后修改时间 比 test 生成的时间早,那么这个 test 就是最新的;反之就不是最新的,可以重新生成。

        如下,一开始 test.c 文件最后修改时间是比 test 生成时间早;然后对 test.c 进行修改,明显看到其最后的修改时间变了比 test 文件的生成时间要晚,此时就可以执行 make  。成功编译,运行。

        根据这个特性,我们可以对 make 进行”欺骗“,即 test.c 文件里的内容不修改,但是也可以多次make。这就需要使用 touch 指令的特性 —— 执行 touch test.c ,如果 test.c 文件已经存在,就只会改变它的 最后修改时间 。根据这里就可以达到 "欺骗" ,如下图。

        关于 make / makefile 的知识就先讲到这里啦,有问题欢迎指出讨论!!

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

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

相关文章

Apache Spark 机器学习 特征抽取 4-1

特征数据集是用于在机器学习中进行训练,有关特征的算法的分类如下所示: 抽取(Extraction),从原始数据集中提取出对应的特征集 转换(Transformation),缩放特征、转换特征以及修改特征…

线程池(关于变量捕获、线程数、针对ThreadPoolExecutor的构造方法参数的解释、自实现线程池)

目录:一、前言二、关于变量捕获三、针对ThreadPoolExecutor的构造方法参数的解释四、自实现线程池一、前言相比较于进程,创建线程 / 销毁线程 的开销是相对较小的,但是太过频繁的创建线程 / 销毁线程,其开销也很大。这时候我们就需…

C 语言编译链接

前言 一个 C 程序究竟是怎么变成可执行程序的,这其间发生了什么?本文将带你简要了解 C 程序编译过程,文章为 《程序员的自我修养—链接、装载与库》的读书笔记,更为详细的过程可以阅读原书。 比如下面一个经典的 C 程序&#xf…

百度飞浆在pycharm中的使用(含官网安装和cuda)

uieGitHub 安装cuda 1 获取版本 我的是 CUDA Toolkit 11.7.1 (August 2022), Versioned Online Documentation 为了防止后期版本不对应,我这里小心谨慎安装了August对应的月份。 C:\Users\89735>nvidia-smi Mon Dec 19 21:31:28 2022 ------------------------…

一眼万年,这3款顶级神软,内存满了也绝不卸载

免费软件都不好用?不!下面3款良心软件,颠覆你的认知,功能强大到离谱,值得收藏往后有需要直接使用。 1、桌面运维助手 这是一款堪称神器的国产电脑优化工具,集硬件管理、系统管理、辅助工具于一体&#xff0…

Effective C++条款39:明智而审慎地使用private继承(Use private inheritance judiciously)

Effective C条款39:明智而审慎地使用private继承(Use private inheritance judiciously)条款39:明智而审慎地使用private继承1、private 继承2、在private继承和复合之间做出正确选择3、使用private继承比组合更加合理的例子4、牢…

wsl安装CUDA

NVCC 昨天已经安装好了gpu版的pytorch,对于一般的代码应该就可以运行了。但有些代码中需要用到cuda算子,需要配置nvcc环境。对于这个我也没能搞太清楚,网上的说法不一,我使用conda安装pytorch时也安装了cudatoolkit,按…

c++11 标准模板(STL)(std::forward_list)(八)

定义于头文件 <forward_list> template< class T, class Allocator std::allocator<T> > class forward_list;(1)(C11 起)namespace pmr { template <class T> using forward_list std::forward_list<T, std::pmr::polymorphic_…

当面试官问:“你还有什么要问我”,怎样回答才最加分?

面试到最后&#xff0c;面试官常常会问求职者&#xff1a;“你还有什么要问我&#xff1f;”许多人面对这个问题&#xff0c;不知该怎样回答&#xff0c;怕回答不好影响自己的面试结果&#xff0c;那么怎么回答才最加分呢&#xff1f;有人说&#xff0c;可以问问这个职位应该具…

springboot整合gateway网关

2.3 搭建Gateway 本项目使用Spring Cloud Gateway作为网关&#xff0c;下边创建网关工程。 新建一个网关工程。 工程结构 添加依赖&#xff1a; XML org.springframework.cloud spring-cloud-starter-gateway com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discove…

TryHackMe-Blog

Blog 比利乔尔&#xff08;Billy Joel&#xff09;在他的家用电脑上写了一个博客&#xff0c;并开始工作。这将是非常棒的&#xff01; 枚举此框并找到隐藏在其上的 2 个标志&#xff01;比利的笔记本电脑上有一些奇怪的事情。你能四处走动并得到你需要的东西吗&#xff1f;还…

蓝队常用的攻击手段

目录 一&#xff0c; 漏洞利用 1.1 SQL 注入漏洞 1.2 跨站漏洞 1.3 文件上传或下载漏洞 1.4 命令执行漏洞 1.5 敏感信息泄露漏洞 在实战过程中&#xff0c;蓝队专家根据实战攻防演练的任务特点逐渐总结出一套成熟的做法:外网纵向突破重点寻找薄弱点&#xff0c;围绕薄弱点…

2022 VeLO: Training Versatile Learned Optimizers by Scaling Up

VeLO: Training Versatile Learned Optimizers by Scaling Up 通过扩展模型的规模来训练一个通用的优化器。 设计上&#xff0c;优化器的原理基于元学习的思路&#xff0c;即从相关任务上学习经验&#xff0c;来帮助学习目标任务。 相比迁移学习&#xff0c;元学习更强调获取元…

2023年批量下载和改名音频专辑(单页列表)

一、下载原理 1&#xff09;找到目标音频的专辑网页&#xff0c;这里以 kite runner mp3为例。&#xff08;需要自己找&#xff09; https://www.xi___ma___la_____ya.com/album/71718770 2&#xff09;进入详细页&#xff08;称为一次请求URL&#xff09;&#xff08;不需要…

JUC(java.util.concurrent)的常见类

文章目录一、JUC常见类Callable 接口ReentrantLockSemaphore(信号量)CountDownLatch一、JUC常见类 concurrent代表了并发&#xff0c;这个包下为我们提供了并发编程(多线程)相关的组件. Callable 接口 我们的Callable接口和Runnable是一样的&#xff0c;但也有一些区别: Run…

C/C++实现跨年表白烟花

跨年表白烟花使用c/c实现烟花效果&#xff08;小白进&#xff09;分析诉求&#xff0c;拆分问题头文件贯穿全文的媒体部分文字部分&#xff1a;进入烟花弹部分烟花弹的属性初始化烟花弹让烟花弹飞起来烟花爆炸烟花弹的属性初始化烟花让烟花炸起来完成代码&#xff1a;使用c/c实…

840个最优的机器学习python开源项目整理分享

本资源包含了840个很棒的机器学习开源项目&#xff0c;总共270万颗星分为32个类别。所有项目均按项目质量得分排名&#xff0c;该得分是根据从GitHub和不同程序包管理器自动收集的各种指标计算得出的。资源整理自网络&#xff0c;资源获取见源地址&#xff1a;https://github.c…

三星手机提取微信聊天数据

三星手机提取微信聊天数据的方法&#xff0c;无需root。 注意&#xff0c;暴力破解密码需要英伟达显卡&#xff0c;一小时内破解&#xff0c;无显卡可能要两天。 1. 安装USB驱动&#xff0c;通过S换机助手&#xff0c;备份微信软件至电脑。注意&#xff0c;选择不加密。 三星…

[硬核] Bootstrap Blazor Table 综合演示例子

知识点: 1.导入导出 2.分页功能 3.增删改查 4.批量删除 5.批量编辑(审核) 6.列排序与列搜索 7.顶部搜索实现所有列搜索 8.高级搜索实现多条件搜索 9.顶部与刷新与视图列 10.实现文本类型明细行 11.列的统计 12.隐藏列,时间日期列格式化 13.新窗口打开 14.随机数据 15.自由编辑…

DVWA靶机CSRF全难度(未完)

目录 Low难度 medium难度 Cross Site Request Forgery跨站的请求伪造 原理&#xff1a;利用受害者尚未失效的身份认证信息、会话&#xff1b;诱骗其访问黑客设计号的页面&#xff0c;在受害人不知情的情况下以受害人的身份向服务器发送请求完成非法操作 Low难度 源代码 &l…