【Linux】makemakefile

news2024/12/29 10:26:45

【Linux】make & makefile

文章目录

  • 【Linux】make & makefile
    • 1、makefile文件
    • 2、make命令
    • 3、make原理规则
    • 4、.PHONY
    • 5、编译与否的判断法

1、makefile文件

makefile实际上是一个文件,配置文件

充当Linux上的工程管理工具,可以实现自动化编译

makefilemake读入的唯一配置文件,makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个

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

类似一个脚本,其中内容包含make所要进行的处理动作以及依赖关系。makefile简单点理解就是各程序文件的组织结构

makefile所要进行的主要内容是明确目标、明确目标所依赖的内容、明确依赖条件满足时应该执行对应的处理动作

例如我们最终要实现a这个目标,但是需要依赖b,而b依赖于c的存在

对于大型工程,makefile提供的效率是非常重要的

所以,makefile的编写能力也反映了程序员完成大型项目的能力

2、make命令

make是linux中的一个常用命令

在当前目录下,输入make,系统会自动在当前目录中寻找名为Makefile或makefile的文件,并对之进行解释处理,根据makefile文件内容

针对目标(可执行文件)进行依赖性检测(要生成该可执行文件之前要有哪些中间文件)并执行相关动作(编译等)

Make工程管理器也就是个“自动编译管理器”,这里的“自动”是指它能够根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入

Makefile文件的内容来执行大量的编译工作。Make将只编译改动的代码文件,而不用完全编译

当你对某个源文件进行了修改,你再次执行 make 命令,它将只编译与该源文件相关的目标文件而不是整个代码工程,因此,为编译完最终的目标(可执

行文件)节省了大量的时间提高工作连贯性。比如一个工程下面有A.c 、B.c、 B.c三个文件,在make生成可执行目标文件之后,改动了A.c,则再次make

时,只会执行有关A.c处理动作,其它的不处理

3、make原理规则

gcc hello.c -o hello

存在上述语句,可以明确:

  • hello.c原始文件
  • hello目标文件

依赖关系:

hello依赖hello.c生成,故hello.chello依赖文件,关系称为依赖关系

gcc hello.c -o hello指令使得hello.c生成hello,这条指令就称为依赖方法

image-20230130210228863

通过这个简单的makefile文件我们可以理解依赖关系和方法:

在 makefile 文件中,共有四组依赖关系和依赖方法 ,当使用 make 调用 makefile 文件中内容时,便开始执行 makefile 中的内容:

  • test 依赖于 test.o ,但是 test.o 并不存在,跳转到下一组依赖关系
  • test.o 依赖于 test.s ,但是 test.s 并不存在,跳转到下一组依赖关系
  • test.s 依赖于 test.i ,但是 test.i 不存在,跳转到下一组依赖关系
  • test.i 依赖于 test.c ,test.c 存在,这时开始执行依赖方法
  • 由此开始,逐渐执行上面的依赖方法,一层层回退,逐渐生成 test.i 、test.s 、test.o ,最后生成可执行程序,make 执行完毕

4、.PHONY

phony是个考研词汇,意思是“虚假的,伪造的”

在这儿.PHONY是一个修饰对象的后缀,修饰的对象被认为是“伪目标”,至于伪目标是什么,接下来会解释

makefile认为你写一个命令,比如说是clean,是一个目标文件,这样Make这个命令会认为clean是一个文件,这样让编写makefile更加的容易,但是有个

问题,如果说和你的makefile同级目录下还有一个clean的文件,那么你去make clean就会失败,这时候你就需要用.PHONY,说明这个是一个假的目标文件,这样你的make clean 就会成功执行

.PHONY是为了避免文件重名造成的make失败执行而存在的一个文件标识

5、编译与否的判断法

对于程序来说,时间有两条线。第一条是源代码时间的一条线,第二条是形成的可执行程序的时间的一条线

有源代码,再有可执行程序。

可执行程序的最近修改时间比源文件的修改时间晚,就认为当前可执行程序是最新的,为了减少时间和其他开销,不执行编译;否则执行编译

我们可以通过touch 可执行程序达到刷新其修改时间的效果,这样就可以在make后不修改源文件的情况下进行编译,当然,这只是一个测试规则的方法。

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

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

相关文章

transformer库的思想

transformer库建立思路 (1) Model类: 如BertModel , 目前收录有超过30个PyTorch模型或Keras模型; (2) Configuration类: 如BertConfig , 用于存储搭建模型的参数; (3) Tokenizer类: 如BertTokenizer , 用于存储分词词汇表以及编码方式; 使用from_pretrained()和save_pretraine…

区块链知识系列 - 系统学习EVM(二)

特点 EVM出于所谓运算速度和效率方面考虑,采用了非主流的256bit整数。不支持浮点数缺乏标准库支持,例如字符串拼接、切割、查找等等都需要开发者自己实现给合约打补丁或是部分升级合约代码在EVM中是完全不可能的 存储 Code code 部署合约时储存 data 字段也就是合…

08-linux网络管理-iptables扩展模块

文章目录1. 概述2. icmp 模块2.1 示例(禁止本机ping其它主机)2.2 示例(其他主机ping本机)2.3 --icmp-type 说明3. iprange模块4. multiport 模块5. state 模块5.1 语法5.2 完整示例6. limit模块6.1 语法6.2 完整示例7. connlimit7…

[2019红帽杯]easyRE1题解

迷蒙马背眠,月随残梦天边远,淡淡起茶烟。 ——松尾芭蕉 目录 1.查壳 2.拖入64位IDA,找到主函数 3.静态分析主函数 4.wp 1.查壳 ELF文件,64bit 2.拖入64位IDA,找到主函数 没有标明main函数,我们打开str…

OSCP_VULHUB COVFEFE: 1

文章目录前言信息收集渗透过程权限提升前言 靶机下载地址:https://www.vulnhub.com/entry/covfefe-1,199/ 攻击机:kali(192.168.132.139) 靶机:covfefe(192.168.132.146) 下载好靶机之后直接使…

vivo 超大规模消息中间件实践之路

作者:vivo 互联网存储技术团队-Luo Mingbo、中间件团队- Liu Runyun 本文根据“2022 vivo开发者大会"现场演讲内容整理而成。 本文主要介绍超大数据规模场景下分布式消息中间件在vivo的应用实践。 在线业务侧主要从RocketMQ集群部署架构、平台系统架构、日常运…

EMC基础:电容的频率特性

本文将对其中使用电容和电感降噪的对策进行介绍,这也可以称为“噪声对策的基础”。在这里使用简单的四元件模型。如果要进一步表达高频谐振时,可能需要更多的元件模型。 电容的频率特性 探讨利用电容器来降低噪声时,充分了解电容器的特性是…

设计模式——软件设计原则

目录 3.软件设计原则 3.1 开闭原则 3.2 里氏代换原则 3.3 依赖倒转原则 3.4 接口隔离原则 3.5 迪米特法则 3.6 合成复用原则 3.软件设计原则 在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要…

8、Servlet——Servlet生命周期、Servlet特性

目录 一、Servlet生命周期 1、生命周期的四个阶段 1.1 实例化 1.2 初始化 1.3 服务 1.4 销毁 2、Servlet执行流程 3、代码演示 二、 Servlet特性 1、线程安全问题 2、如何保证线程安全 一、Servlet生命周期 1、生命周期的四个阶段 1.1 实例化 当用户第一次访问Ser…

flutter裁剪三角形,并设置三角形最长边阴影(类似钉钉登录页右上角图标样式)

需求 需要使用flutter创建类似钉钉登录页右上角图表样式 过程 图标 图标直接从阿里巴巴图标库中下载png文件,并设置相应颜色 三角形阴影 样式的主要难点在三角形及三角形阴影这里 1、三角形的裁剪有两种方法: 第一种是 使用边框实现三角形 参考博客…

springboot自动加载--自定义启动器

创建自定义启动器 0、项目总览 1、创建项目&#xff0c;引入依赖 创建项目 spring-boot-jdbc-starter&#xff0c;引入依赖&#xff0c;pom文件如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apa…

b站黑马Vue2后台管理项目笔记——(1)登录功能

说明&#xff1a; 此项目中使用的是本地SQL数据库&#xff0c;Vue2。 其他功能请见本人后续的其他相关文章。 本文内容实现的最终效果如下图&#xff1a; 目录 一&#xff0e;登录功能的实现 1.登录页面的布局&#xff1a; &#xff08;1&#xff09;查看当前工作区是否干净…

读锁应该插队吗?什么是锁的升降级?

背景 ReentrantReadWriteLock可以设置公平或非公平&#xff0c;为什么&#xff1f; 读锁插队策略 每次获取响应锁之前都要检查能否获取 readerShouldBlockwriterShouldBlock 公平锁 final boolean writerShouldBlock() {return hasQueuedPredecessors(); } final boolean …

打造智慧工地,低代码平台助力基建行业全链路数字化升级

编者按&#xff1a;基建行业数字化转型需求迫切&#xff0c;低代码平台有助于加快数字化转型速度&#xff0c;赋能建筑工程企业升级。本文分析了低代码在基建行业中的应用价值&#xff0c;并指出基建行业对于低代码平台的需求&#xff0c;最后通过相关案例的展示了低代码平台在…

低代码平台解读:“低代码+PaaS”的技术创新实践

数字化转型已经成为必然趋势&#xff0c;几乎所有传统行业都喊出了数字化转型的口号。但在数字化转型中&#xff0c;很多企业面临着成本高、周期长的难题。低代码是其中一种破解难题的方式&#xff0c;如今的低代码已经是企业数字化的核心引擎。 低代码平台越来越多&#xff0…

数据结构——链表(五)

数据结构 文章目录数据结构前言一、什么是链表二、实现单链表1.单链表的结构2.单链表的初始化3.单链表的插入4.遍历链表5.链表长度总结前言 接下来学习一下链表&#xff0c;链表比数组用的更多。 一、什么是链表 概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存…

《从0开始学大数据》之如何自己开发一个大数据SQL引擎

背景 大数据仓库 Hive&#xff0c;作为一个成功的大数据仓库&#xff0c;它将 SQL 语句转换成 MapReduce 执行过程&#xff0c;并把大数据应用的门槛下降到普通数据分析师和工程师就可以很快上手的地步。 但是 Hive 也有自己的问题&#xff0c;由于它使用自己定义的 Hive QL …

Linux常用命令——repquota命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) repquota 报表的格式输出磁盘空间限制的状态 补充说明 repquota命令以报表的格式输出指定分区&#xff0c;或者文件系统的磁盘配额信息。 语法 repquota(选项)(参数)选项 -a&#xff1a;列出在/etc/fstab文…

gRPC 基础(二)-- Go 语言版 gRPC-go

gRPC-Go Github gRPC的Go实现:一个高性能、开源、通用的RPC框架&#xff0c;将移动和HTTP/2放在首位。有关更多信息&#xff0c;请参阅Go gRPC文档&#xff0c;或直接进入快速入门。 一、快速入门 本指南通过一个简单的工作示例让您开始在Go中使用gRPC。 1.1 先决条件 Go:…

word排版技巧:这几种特殊版式轻松搞定

我们在许多报刊、杂志中会见到一些带有特殊效果的文档&#xff0c;如首字下沉、分栏排版、竖排文档等形式的排版效果。这些效果其实不是只有专业排版软才能实现&#xff0c;利用Word我们可以轻松完成这些排版效果。1、首字下沉首字下沉是一种突出显示段落中的第一个汉字的排版方…