Linux·权限与工具-make

1. Makefile/makefile工具

        首先展示一下,makefile工具如何使用。我们先写一个C语言程序

                

        然后我们建立一个Makefile/makefile文件,m大小写均可。我们在文件中写入这样两行

                

        wq保存退出后,我们使用 make 命令

                 

        可以看到生成了可执行程序,其效果就是我们刚才写的打印出 hello world

        这就是makefile的作用,一个工程中的源文件不计其数,其按类型、功能、模块分放在若干给文件当中,而makefile定义了一系列的规则来指定,哪些文件需要先编译,那些文件需要后编译,和其他一些操作。它是一个“自动化编译”的效果,一旦写好makefile文件,我们就无需自己手动一个一个的敲编译命令,至于要一个make就可以使整个工程完全自动编译起来。

        

1.1 make语法

        下面我们就来拆解一下makefile文件的语法。

                        

        第一行冒号前的部分我们叫目标文件,可以通过make调用目标文件来达到执行下面依赖方法的效果。

        冒号后面的部分我们叫依赖文件列表,这个列表中可以放多个依赖文件,用于提供给下面的依赖方法使用,就是说依赖方法要依赖这个列表中的文件去执行某些操作。

        第二行我们写依赖方法,依赖方法必须以tab开头。

        目标文件和依赖文件列表的集合称为依赖关系,makefile本质是依赖关系和依赖方法的集合。

        事实上,makefile文件的作用是执行事先使用依赖方法写好的一些命令:

                        

                        

        可以看到 make+目标文件 就可以很好的完成我们预设定好的命令,但是它在执行命令的时候都会把命令打印一边,如果不想看见打印命令的话,可以在命令前加上@符号就可以

        这里可以发现我在执行第一行编译的时候并没有加上目标文件,但是在执行第四行和第九行的时候都加上了目标文件。

        这是因为makefile文件,会被make从上到下扫描,第一个目标名,是对于make来说属于可以缺省形成的,也就是说如果make后面什么都不跟,就默认执行第一个目标文件。也就是说,谁放在最开头,谁就可以直接make执行不需要加目标文件名。

1.2 make特性

1.2.1 执行中断

        我们进入代码文件中,故意写出点语法错误,这样编译的话就会导致报错,然后我们再对makefile文件也稍加修改,让它在编译完成之后打印点东西出来

       make执行一下编译命令。

                

        可以看到,在编译报错之后直接跳出了makefile文件,执行被中断 aaa 并没有被打印出来。

1.2.2 更新编译 与 stat命令

        ps:其实这个更新编译的特性属于make指令和gcc编译指令结合后出现的特性,单独使用gcc编译指令是不会出现这一特性的。

        其实我前面写的makefile文件是有问题的,在编译的依赖方法中,实际上是hello文件在依赖hello.c文件,但是我在目标文件中声明的文件却是proc文件作为目标文件在依赖helloc.c文件。如果按我上面这种错误的语法写makefile的话是不会出现更新编译的特性的。

        因此我们先把makefile文件改成正确的语法

                                

       我们clean清理一下,然后make多次,看看现象。

                

        可以看到只成功make了一次,之后再make就表示hello已经是最新了,不再编译。

        这拒绝编译的反应是符合道理的,因为如果一个文件已经是最新了就没必要再重复编译,如果一个文件很大,那重复编译的行为就会浪费掉大量的时间成本。

        其拒绝编译的逻辑就是对比目标文件和依赖文件的更新时间,如果依赖文件的更新时间更早说明目前的目标文件是最新状态,如果依赖文件更新时间更晚,说明hello.c文件已经被更改过了,目标文件也就需要重新编译了。

        这个文件的属性我们可以用 stat 命令来查看。

        其中时间属性就是我圈出来的这三个时间,第一个Access我们称为Atime表示最近文件被访问的时间,它比较没用,更新编译也不看这个时间。它这里面的机制比较奇怪不是说访问一次就一定会记录下来,而是访问到了一定次数才会记录一次,主要是为了防止操作系统要频繁的修改文件的访问时间属性。

        第二个Modify我们称为Mtime表示文件内容最近被修改的时间,第三个Change我们称为Ctime表示文件属性最近被修改的时间。

        修改文件内容可能会牵连到文件属性的修改,比如文件的大小。

        更新编译的逻辑就是根据Mtime进行对比的,如果.c文件修改时间早于目标文件,说明目标文件已经是最新的了,无需编译;如果.c文件修改时间晚于目标文件,说明.c文件被更新过了,目标文件也需编译更新。

1.2.3 .PHONY 设置伪目标

        如果我们想让这个编译指令忽略掉更新限制,我们可以选择将设置伪目标,语法如下

                ​​​​​​​        ​​​​​​​        

        这个语法的意思就是将hello文件变成了一个伪目标,也就是说告诉makefile hello 是一个不存在的文件,此时makefile就不会去特意对比hello和hello.c文件的更新时间,而是直接执行gcc编译指令了。

        这个语法就和我一开始所写的proc目标文件错误有异曲同工之处,它们都是不存在的伪目标,只不过一种是刻意用 .PHONY 指定出来的,一种是真的不存在。

        可以验证一下,将hello设置成伪目标之后是不是可以忽略最新编译限制去make了

        ​​​​​​​        ​​​​​​​        

        也可以将目标文件搞成proc一个真正不存在的目标试试,也是同样的效果。

1.2.4 入栈执行

        我们可以在makefile文件中如下写法,将上节中编译的整个过程写出来

                       

        然后我们保存退出,试试这样make的效果

        ​​​​​​​        ​​​​​​​        

        我们可以通过这里看出,当makefile发现目录的明面上没有hello.o文件,那它就会将依赖方法入栈,然后直到找到出口回归,将栈中所有依赖方法执行。

1.2 make进阶语法

1.2.1 %通配符

        我们在实际使用的时候不会像上面那样把一个文件的编译过程弄的那么复杂,而是会面临一次性想要编译多个文件的需求。

        处理这样的问题可以是使用makefile中类似通配符的东西 % 

        ​​​​​​​        ​​​​​​​        

        由makefile自己推导所需的.c文件,将它们一个一个的交给gcc -c指令,并生成对应的.o文件,其效果我们可以make看一下

        ​​​​​​​        

1.2.2 =变量定义

        makefile中还可以定义和使用变量,用作设定文件名。

        ​​​​​​​        ​​​​​​​        

        定义时等号左右不能有空格,使用变量时用 $(变量) 将变量包起来,这样makefile文件就会将定义好的内容替换到下面的各个位置。

        

1.2.3 $符号的使用

        我们前面说过 $< 的含义是将依赖列表中的文件一个一个的交给指令。

        下面还有   $^   $@   两个指令

        ​​​​​​​        ​​​​​​​        

        其中 $^ 的含义就是将依赖列表中的所有文件一次性交给指令, $@ 的含义是将 : 左侧也就是想要形成的目标文件。

        这种操作就像是在宏替换一样。这样写完后我们就可以通过一份 hello.c 文件生成多个任意名称的文件,只需要修改bin设定的值即可。

1.2.4 一次性形成多个可执行程序

        现在我们想要一次性把 hello.c hello1.c 都形成可执行程序改怎么做

        ​​​​​​​        ​​​​​​​        

        事实上我们可以使用伪目标的依赖列表来巧妙的完成这一需求

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

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

相关文章

人工智能在Facebook的角色:创新与挑战并存

人工智能&#xff08;AI&#xff09;已经成为推动科技进步的重要力量&#xff0c;而在社交媒体领域&#xff0c;Facebook则是将AI技术广泛应用的先锋。Facebook通过AI来改善用户体验、提高内容质量以及优化广告投放&#xff0c;极大地提升了平台的功能与价值。然而&#xff0c;…

渗透第三次作业

xss game前八关复现 第一关 传参进入h2标签 传入一个alert(1) 发现没有触发&#xff0c;原因是官方禁用了script 选择用img标签 ?somebody<img src1 οnerrοr"alert(1337)"> 第二关 先把它的双引号闭合掉&#xff0c;再执行1337再闭合 ?jeff111";al…

【Python零基础】while循环和用户输入

文章目录 前言一、input()函数二、while循环三、使用while循环来处理列表和字典总结 前言 我们开发一个应用程序&#xff0c;目的都是为了解决最终用户的问题&#xff0c;针对用户界面输入的数据&#xff0c;按照用户期待的逻辑进行处理&#xff0c;得到用户想要的结果。本章将…

Java | Leetcode Java题解之第347题前K个高频元素

题目&#xff1a; 题解&#xff1a; class Solution {public int[] topKFrequent(int[] nums, int k) {Map<Integer, Integer> occurrences new HashMap<Integer, Integer>();for (int num : nums) {occurrences.put(num, occurrences.getOrDefault(num, 0) 1);…

【机器学习】(基础篇六) —— 数据集的划分和过拟合问题

数据集的划分 训练集和测试集 在机器学习中&#xff0c;数据集通常会被划分为训练集&#xff08;Training Set&#xff09;和测试集&#xff08;Test Set&#xff09;&#xff0c;有时还会包括一个验证集&#xff08;Validation Set&#xff09;。这样的划分是为了能够更好地…

SQL 数据库设计、事务、视图 <13>

一、数据库设计 1.多表之间的关系 1&#xff09; 一对一&#xff08;了解&#xff09; 如&#xff1a;人和身份证 分析&#xff1a;一个人只有一个身份证&#xff0c;一个身份证只能对应一个人 2&#xff09;一对多&#xff08;多对一&#xff09; 如&#xff1a;部门和员…

Flink消费Kafka数据积压排查解决

0、背景 有个Flink任务每天不定时会出现数据积压&#xff0c;无论是白天还是数据量很少的夜里&#xff0c;且积压的数据量会越来越多&#xff0c;得不到缓解&#xff0c;只能每日在积压告警后重启&#xff0c;重启之后消费能力一点毛病没有&#xff0c;积压迅速缓解&#xff0…

立仪光谱共焦传感器行业应用|薄膜高度差扫描

01&#xff5c;检测需求&#xff1a;扫描薄膜圆圈的高度差 02&#xff5c;检测方式 客户要求扫描薄膜圆圈的高度差&#xff0c;根据观察样品我们选择立仪科技D40A30镜头搭配H系列控制器进行测量 03&#xff5c;光谱共焦测量结果 薄膜圆圈的高度差轮廓 04&#xff5c;光谱共焦…

在CodeBlocks搭建SDL2工程OLED液晶模拟器虚拟OLED单色液晶(128x64)

在CodeBlocks搭建SDL2工程OLED液晶模拟器虚拟OLED单色液晶 例程说明源码下载目录工程配置一、SDL2的初始化和退出二、OLED画点和读点三、更新OLDE的GRAM四、清屏和清某区域五、点阵字库六、显示字符串七、显示中文字符八、显示图片九、测试代码十、主函数十一、运行结果 例程说…

05 serv00安装typecho

下载 ‍ cd domain/xxx.serv00.net/# 下载typecho git clone https://github.com/typecho/typecho.git# 当前有两个目录 typecho/ 和 public_html/ ls# 替换html rm -rf public_html/ mv typecho public_html‍ 安装 浏览器访问你的网站 xxx.serv0.net&#xff0c;看见 type…

8月15日笔记

masscan安装使用 首先需要有c编译器环境。查看是否有c编译器环境&#xff1a; gcc -v如果系统中已经安装了 GCC&#xff0c;这个命令将输出 GCC 的版本信息。如果未安装&#xff0c;你会看到类似于 “command not found” 的错误消息。 如果没有下载&#xff0c;使用如下命令…

万维网与HTTP协议:基础知识简明指南

引言 在当今的数字时代&#xff0c;了解万维网&#xff08;World Wide Web, WWW&#xff09;和HTTP协议&#xff08;Hyper Text Transfer Protocol&#xff09;是至关重要的。本文将为基础小白们简明扼要地介绍万维网及其核心协议HTTP&#xff0c;并通过简单的例子和清晰的段落…

C语言内存操作函数

目录 一. C语言内存操作函数 1. memcpy的使用和模拟实现 2. memmove函数 3. memset函数 4. memcmp函数 一. C语言内存操作函数 随着知识的不断积累&#xff0c;我们所想要实现的目标程序就会更加复杂&#xff0c;今天我们来学习一个新的知识叫做C语言内存操作函数&#x…

基于Python的火车票售票系统/基于django的火车购票系统

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&…

面试经典算法150题系列-最长公共前缀

最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""。 示例 1&#xff1a; 输入&#xff1a;strs ["flower","flow","flight"] 输出&#xff1a;"fl"示例 2&…

HTML及CSS面试题4

1、BFC 1.1、介绍BFC及其应用 补充——触发BFC的方式&#xff0c;常见的有&#xff1a; 设置浮动overflow设置为&#xff1a;auto、scroll、hiddenpositon设置为&#xff1a;absolute、fixed 介绍&#xff1a; ○ 所谓BFC&#xff0c;指的是&#xff1a;一个独立的布局环境&am…

集合的知识点

一、集合的简介 1.1 什么是集合 集合(Collection)&#xff0c;也是一个数据容器&#xff0c;类似于数组&#xff0c;但是和数组是不一样的。集合是一个可变的容器&#xff0c;可以随时向集合集合中添加元素&#xff0c;也可以随时从集合中删除元素。另外&#xff0c;集合还提…

鸿蒙(API 12 Beta3版)【录像流二次处理(C/C++)】媒体相机开发指导

通过ImageReceiver创建录像输出&#xff0c;获取录像流实时数据&#xff0c;以供后续进行图像二次处理&#xff0c;比如应用可以对其添加滤镜算法等。 开发步骤 导入NDK接口&#xff0c;接口中提供了相机相关的属性和方法&#xff0c;导入方法如下。 // 导入NDK接口头文件#in…

使用python实现3D聚类图

实验记录&#xff0c;在做XX得分预测的实验中&#xff0c;做了一个基于Python的3D聚类图&#xff0c;水平有限&#xff0c;仅供参考。 一、以实现三个类别聚类为例 代码&#xff1a; import pandas as pd import numpy as np from sklearn.decomposition import PCA from sk…

开源版最新LoveCardsV2表白墙源码下载

源码亮点 模板系统&#xff0c;给你无限可能 卡片不限字数&#xff0c;支持多图片上传 支持评论&#xff0c;点赞&#xff0c;让互动性拉满 管理后台可添加多个管理员 卡片一键分享至多平台 卡片浏览次数统计 发行版开箱即用 部署教程 1. 环境&#xff08;参考开发环境&…