【Linux】Linux下的项目自动化构建工具——make和makefile

❤️前言

        大家好,好久不见!今天小狮子为大家带来的文章是一篇关于Linux下的项目自动化构建工具——make和makefile的博客,希望能帮助到大家。

正文

        当我们进行涉及多文件的工程开发时,我们需要对很多不同类型、不同功能,存在于不同目录下的源文件进行编译操作,这时错综复杂的文件关系会对我们造成很大的麻烦。那么这时我们就需要使用到make和makefile这样的自动化构建工具。

        我们先大致地对make和makefile进行描述:

        makefile是一个文件,其中定义了各个源文件的编译规则,比如说哪个文件应该先编译,哪个文件应该后编译,哪些文件需要重新编译等。除此之外,在makefile中还可以进行一些功能操作,例如对工程中的老旧文件进行清理。

 

        make是一条指令,它可以解析makefile中的各种指令,从而自动化地对工程中的源文件进行各种操作。

 

        make和makefile搭配使用可以大大地减少我们的工作量,达成“自动化编译”,这时我们只需要一个指令便可以使整个工程完全自动编译。

        当我们大致地了解了make和makefile之后,我们接着对这两者进行详细的学习。

简单的运用

        当我们想要使用make和makefile,我们首先需要在当前目录下创建一个makefile,makefile的文件名可以为makefileMakefile或者GNUmakefile。这时固定的,因为在默认的情况下,make命令会在当前目录下按顺序找寻文件名为“GNUmakefile”、“makefile”、“Makefile”的文件。

        那么我们以经典的“Hello world!”来简单演示和讲解make和makefile的使用方法。当我们创建了一个makefile之后,我们还需要创建该程序所需要的源文件,我将它命名为main.c,并在其中编写相关的代码(输出"Hello world!")。

        准备过程完成如下:

          现在我们进行对makefile文件的编写,编写makefile时,我们需要写入的内容主要有两个,分别称为依赖关系依赖方法

依赖关系:

        表示一个文件的生成是依附于另一个文件,语法为 【目标文件:被编译文件】 ,也就是表明目标文件依赖被编译文件。

依赖方法:

        代表依赖关系中的依赖文件该如何转化为目标文件,语法为 【tab 由依赖文件生成目标文件的手段】(这里必须使用tab作为前缀)。

        那么让我们看看Hello world对应的makefile的依赖关系和依赖方法该如何编写:

         这样设定好依赖关系和依赖方法之后我们就可以使用make创建出名为 HW 的可执行文件。语法为【make 指令】。其中 :

  • makefile中可能会有多个目标文件,但是makefile会以第一个目标作为终极目标。
  • 使用make时的默认动作就是第一个目标对应的规则,也就是只输入make就会默认生成第一个目标。
  • make扫描makefile的顺序是从上到下。

         除此之外,如果我们现在想要对编译过程中产生的临时文件进行清理或者清理旧版本的程序时,如果我们直接使用rm指令进行清除,这样的行为未免有些粗鲁和危险。于是makefile中也需要支持对文件的清理工作,也就是clean。同样按照依赖关系和依赖方法的形式进行编写:

         那么我们现在可以尝试使用makefile中的规则对文件进行清理:

                 上面就是make和makefile的一些简单运用,现在我们来看看makefile的工作原理:

  1. 目标的生成: a. 检查依赖关系中的依赖文件是否存在; b. 若依赖文件不存在,则寻找是否有某个规则用来生成该依赖文件。
  2. 目标的更新: a. 检查目标的所有依赖,任何一个依赖有更新时,就重新生成目标; b. 目标文件比依赖文件时间晚,则需要更新。

        在目标的更新中提到了文件时间的问题,这里简单的拓展一些关于文件时间的知识。我们都知道,文件=文件内容+文件时间。文件时间一般被分成三个时间,可以简单记为ACM三个时间:A(Access)、C(Change)、M(Modify)。Change代表最近改变文件内容的时间,Modify代表最近改变文件属性的时间,Access代表最近读文件的时间。

伪目标

        如果我们不想考虑文件时间,而想要无论什么情况都重新编译,这时就需要设置伪目标。伪目标表示这个目标总是被执行。一般来说产生可执行文件的逻辑是不会用伪目标修饰的,伪目标一般用于clean。

特殊符号

        makefile中有一些特殊符号,这里列举一些特殊符号。

        - :表示此命令即使执行出错,也依然继续执行后续命令。如:

        -rm a.o build/

        @:表示该命令只执行,不回显。一般规则执行时会在终端打印出正在执行的规则,而加上此符号后将只执行命令,不回显执行的规则。如:

        @gcc -o HW main.c

        $@和$^ 前者指的是依赖关系中的目标文件,后者指的是依赖关系中的依赖文件。如;

        HW:main.c

        gcc -o $@ $^

🍀结语

        以上就是make和makefile的基本入门知识啦,希望能对大家有所帮助。

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

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

相关文章

【批量将视频转为图像序列】

批量将视频转为图像序列 代码如下,代码中带有解释: # 导入所需要的库 import cv2 import os import numpy as np# 多个视频所在的路径 datasets_path ["/home/y/Code/数据集/1/007f.mp4","/home/y/Code/数据集/1/05f.mp4","/…

Android Java代码与JNI交互 JNI方法Java类字段 (六)

🔥 Android Studio 版本 🔥 🔥 Java 基础类型数据对应 Native层的字母 🔥 通过 jni 查找java某个类中相应字段对应的数据类型 , 需要使用到 jni 中的 GetFieldID() 函数 jfieldID GetFieldID(jclass clazz, const char* name, const char* sig){ return functions-…

可使用Linux 测试IP和端口是否能访问,查看返回状态码

一、 使用wget判断 wget是linux下的下载工具,需要先安装. 用法: wget ip:port wget ip:port连接存在的端口 二、使用telnet判断 telnet是windows标准服务,可以直接用;如果是linux机器,需要安装telnet. 用法: telnet ip port…

CNN从搭建到部署实战(pytorch+libtorch)

模型搭建 下面的代码搭建了CNN的开山之作LeNet的网络结构。 import torchclass LeNet(torch.nn.Module):def __init__(self):super(LeNet, self).__init__()self.conv torch.nn.Sequential(torch.nn.Conv2d(1, 6, 5), # in_channels, out_channels, kernel_sizetorch.nn.Sig…

windows搭建git服务器 无法识别 ‘git‘ 命令:exec: “git“: executable file not found in %PATH%

无法识别 git 命令:exec: "git": executable file not found in %PATH% 确保已经安装git,如下图配置环境变量即可。

Mysql查询

Mysql查询 一.DQL基础查询1.语法2.特点3.查询结果处理 二.单行函数(1)字符函数(2)逻辑处理(3)数学函数(4)日期函数 三.分组函数四.条件查询五.比较六.模糊查询七.UNION和UNION ALL(1)UNION(2)UNION ALL 八.排序九.数量限制十.分组查询 一.DQL基础查询 DQL(Data Que…

奇葩功能实现:级联选择框组件el-cascader实现同一级的二级只能单选,但是一级可以多选

前言: 其实也不能说这个功能奇葩,做项目碰到这种需求也算合理正常,只是确实没有能直接实现这一需求的现成组件。 el-cascader作为级联选择组件,并不能同时支持一级多选,二级单选的功能,只能要么是单选或者…

SpringBoot 配置文件:什么是配置文件?配置文件是干什么?

文章目录 🎇前言1.配置文件的格式2. properties配置文件说明2.1 properties基本语法2.2 读取配置文件 3. yml 配置文件说明3.1 yml 基本语法 4.properties与yml 对比 🎇前言 学习一个东西,我们先要知道它有什么用处。整个项目中所有重要的数…

java单元测试(调试)

文章目录 测试分类JUnit单元测试介绍引入本地JUnit.jar编写和运行Test单元测试方法设置执行JUnit用例时支持控制台输入10.6.6 定义test测试方法模板 测试分类 **黑盒测试:**不需要写代码,给输入值,看程序是否能够输出期望的值。 **白盒测试…

【解决】Android Studio打包出现not found for signing config ‘externalOverride‘

问题出现场景 之前我的这个项目在另一台电脑上开发,现在迁移到这台计算机上,出现了key报错的问题,网络上有些说需要在XML中进行配置signature相关的内容,这个感觉比较复杂,本文主要介绍一个简单的解决方法,…

VectorCAST单元测试参数配置

一、打开 VectorCAST 通常情况下,技术人员会配置一个脚本文件(.bat、.cmd),用户可以通过这个脚本文件来启动 VectorCAST。使用脚本文件启动 VectorCAST,可以在启动时设置好编译器相关的环境变量,方便 Vecto…

el-ment ui 表格组件table实现列的动态插入功能

在实际需求中我们经常遇到各种奇葩的需求,不足为奇。每个项目的需求各不相同,实现功能的思路大致是一样的。 本文来具体介绍怎么实现table表格动态插入几列。 首先实现思路有2种, 1. 插入的位置如果是已知的,我知道在哪个标题的…