Linux基础——Linux开发工具(下)_make/makefile

前言:在经过前面两篇学习,大家对Linux开发工具都有一定的了解,而在此之前最重要的两个工具就是vim,gcc。


如果对这两个工具不太了解,可以先阅读这两篇文章:
Linux开发工具 (vim)
Linux开发工具 (gcc/g++)


在这里插入图片描述


首先让我们来初步了解一下本篇的目标:
1. 学习make/makefile,并能简单使用
2. 学习git使用,并能简单使用

在这里插入图片描述

本篇主要内容
Linux项目自动化构建工具 - make/Makefile
git仓库管理 - git

在这里插入图片描述


Linux开发工具

  • 1. Linux项目自动化构建工具 - make/makefile
    • 1.1 make/makefile的背景
    • 1.2 make/makefile简介
    • 1.3 伪目标
    • 1.4 文件的三个属性
    • 1.5 makefile的依赖关系
  • 2. git的简单介绍以及使用
    • 2.1 git的简单介绍
    • 2.1 git的三板斧
      • git add
      • git commit
      • git push
  • 3. 总结

1. Linux项目自动化构建工具 - make/makefile

1.1 make/makefile的背景

  • 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力
  • 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作
  • makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
  • make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
  • make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

如果在Linux下编程需要频繁的编译和删除时,这会使我们的效率变得很低下,所以我们学习自动化构建代码


1.2 make/makefile简介

make是一条命令,makefile是一个文件!!!

makefile文件的内容需要我们自己编写,而make则是启动makefile的钥匙

让我们来简单创建编写一个makefile。
在这里插入图片描述

在这里插入图片描述

这就完成了一个简单的makefile文件,包含了编译和删除功能


我们用vim编写一下test.c
在这里插入图片描述
在编写完成,保存退出后,我们实现自动化构建代码只要:

指令:make

在这里插入图片描述
如果想执行删除功能,我们只要:

指令:make clean

在这里插入图片描述


那为什么形成可执行程序可以直接用make,但是删除不行呢?
在上面编写的Makefile中

指令:makemake mytest执行后的结果是一样的

在这里插入图片描述

因为直接使用make时,会从上到下扫描makefile文件,扫描到第一个目标文件,就会执行它,所以makefile文件中的第一个指令是可以直接使用make执行,但是注意后面的指令,make后面必须要跟特定的指令

例如:
在这里插入图片描述
如果我们这样编写Makefile那直接使用make将会怎么执行
在这里插入图片描述
此时,make的功能将不再是生成可执行程序


1.3 伪目标

我们来看以下代码
在这里插入图片描述
发现clean是被.PHONY修饰的,而.PHONY是将clean指令修饰成了伪目标。


伪目标又是什么呢?

当我们短时间内多次make时:
在这里插入图片描述

我们只有第一次使用make时,程序执行了,但是当我们使用.PHONY修饰的clean时,每一次都可以成功执行

因此我们可以知道:

  • 伪目标是总是被执行的
  • make和makefile总是不让重新编译代码

1.4 文件的三个属性

我们先了解以下系统为什么要在第二次make的时候将我们的请求给拒绝:

  • 从效率上来看:文件在第二次make的时候并没有被修改,所以系统为了提高效率而拒绝make

系统怎么知道我们的文件是否进行了修改?

通过一个文件修改的时间

  • 第一次的时候,一定是先有源文件,才有可执行文件
    源文件的修改时间<可执行文件的修改时间
  • 第二/n次的时候,我们对源文件做任何修改的时候
    源文件的修改时间>可执行文件的修改时间
  • 编译重新生成可执行

我们可以直接查看文件的属性:
指令:stat 文件名

stat指令既可以查看源文件属性,也可以查看可执行程序的属性
在这里插入图片描述

我们总是说 文件 = 内容+属性

红框里面的三个属性都是表示文件的时间,但是每一个表示的含义都不一样,让我来简单介绍一下
在这里插入图片描述

在每次做出对应操作之后相应时间都会改变

注意:access时间不是实时更新的
在这里插入图片描述

因此系统通过时间的对比不让我们频繁的进行编译代码操作,而伪目标的作用就是强制执行指令


1.5 makefile的依赖关系

make/makefile兼具推导能力

比如:我们可以写下以下程序
在这里插入图片描述
在这里插入图片描述

可执行程序mytest的生成依赖.o文件但是此时没有.o文件
就会执行下一条指令,但是.o文件依赖的是.s文件,系统中此时没有.s文件
又需要往下继续寻找,在找到系统内包含的.c文件时,程序将会执行回去

以此可以验证make/makefile的推导能力


makefile中可以自定义变量
在这里插入图片描述
在自定义变量时,我们需要使用$()将变量修饰。
在这里插入图片描述
同样生成了可执行程序


makefile文件还可以进行简写

Makefile文件的简写方式:

  • $@:表示依赖关系中的目标文件(冒号左侧)
  • $^:表示依赖关系中的依赖文件列表(冒号右侧全部)

在这里插入图片描述

$@表示:mytest
$^表示:test.c

如果不想指令打印在显示器上我们可以在对应行前面加:@
在这里插入图片描述
在这里插入图片描述
此时删除时的提示被隐藏


2. git的简单介绍以及使用

2.1 git的简单介绍

git是一种代码管理器,git程序与Linux系统的是一家人,因此Linux与gitee或GitHub之间有一定联系

首先我们需要在gitee上有一个远端仓库,创建完成后,在管理仓库里设置开源
在这里插入图片描述
然后克隆复制地址
在这里插入图片描述
再复制好链接之后,我们在Linux下输入指令:

指令:git clone 链接

在这里插入图片描述
即可将远端仓库克隆到本地

完成之后我们可以在里面新建文件和目录
在这里插入图片描述


2.1 git的三板斧

git add

我们在当前目录下直接输入:
指令:git add 文件名git add .

  • 如果指定文件那么就会将指定文件添加到本地仓库
  • 如果是后者那么会将此目录下所有文件添加到本地仓库

如果在多次添加后记不清本地仓库有哪些文件我们也可以查看:
指令:git status

在这里插入图片描述
这样可以查看本地仓库有哪些文件


git commit

git commit 就是添加日志

在commit时一定要输入日志
指令: git commit -m "日志"

日志的填写不能随意,日志内容会随着文件一起提交到远端仓库。如果随意填写,在被别人查看时,难免会出现不好的一面。
在这里插入图片描述
这样代表日志更新成功!

注意:在第一次使用commit时系统可能会让你输入邮箱和用户名密码。按照系统提示的操作就行


git push

git push就是将我们刚刚进行的操作从本地仓库推出送到远端仓库:
指令:git push

注意:刚刚进行的git add并没有将文件直接推送到远端仓库

在这里插入图片描述
输入你自己的用户名和密码即可PUSH成功!

3. 总结

在这里插入图片描述

Linux常用的开发工具我们就说到这里,Linux开发工具不仅仅只有这么一点,make/makefile我们也仅仅只做到了入门,做一下简单的介绍,目前阶段完全够用,Linux内容还有很多,希望我们能继续加油。
谢谢大家支持本篇到这里就结束了
在这里插入图片描述

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

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

相关文章

数据挖掘之基于K近邻算法的原油和纳斯达克股票数据预测分析

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 在当今日益复杂的金融市场中&#xff0c;准确地预测原油价格和纳斯达克股票市场的走势对于投资者、政…

【JAVA】part5-Java集合

Java 集合 Java集合概述 Java数组的局限性 数组初始化后大小不可变&#xff1b;数组只能按索引顺序存取。 Java的java.util包主要提供了以下三种类型的集合&#xff1a; List&#xff1a;一种有序列表的集合&#xff0c;例如&#xff0c;按索引排列的Student的List&#xff1b…

代码随想录算法训练营DAY43|C++动态规划Part5|1049.最后一块石头的重量II、494.目标和、474.一和零

文章目录 1049.最后一块石头的重量II思路CPP代码 494.目标和回溯算法抽象成01背包问题CPP代码本题总结 474.一和零思路CPP代码 1049.最后一块石头的重量II 力扣题目链接 文章链接&#xff1a;1049.最后一块石头的重量II 视频链接&#xff1a;这个背包最多能装多少&#xff1f;L…

8 聚类算法

目录 0 背景 1 Kmeans 1.1 聚类数量k的确定 2 DBSCAN 2.1 三个点 2.2 算法流程 3 层次聚类 3.1 过程 4 基于分布的聚类:高斯混合模型 0 背景 聚类算法是一种无监督学习技术&#xff0c;用于将数据集中的数据点划分为不同的组或簇&#xff0c;使得同一组内的数据点彼此相…

nginx缓存清理

背景 昨天打开我的gpt镜像网站&#xff0c;意外发现静态图片资源全都无法获取了 CoCo-AI 一番排查下来&#xff0c;发现是引用的cdn链接失效了 且cdn源是属于七牛云的&#xff0c;且不再维护&#xff0c;于是果断切换到cloudflare export function getEmojiUrl(unified: str…

Qt简单离线音乐播放器

有上传本地音乐文件&#xff0c;播放&#xff0c;暂停&#xff0c;拖拉进度条等功能的播放器。 mainwindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include <QMediaPlayer> #include <QFileDialog> #include <QTime&g…

【Leetcode每日一题】 分治 - 排序数组(难度⭐⭐)(69)

1. 题目解析 题目链接&#xff1a;912. 排序数组 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 归并排序&#xff08;Merge Sort&#xff09;是一种采用“分而治之”&#xff08;Divide and Conquer&#xff09;策略…

数字电路-5路呼叫显示和8路抢答器

本内容涉及两个电路&#xff0c;分别为5路呼叫显示电路和8路抢答器电路&#xff0c;包含Multisim仿真原文件&#xff0c;为掌握FPGA做个铺垫。紫色文字是超链接&#xff0c;点击自动跳转至相关博文。持续更新&#xff0c;原创不易&#xff01; 目录&#xff1a; 一、5路呼叫显…

【百度Apollo】探索自动驾驶:百度Apollo视觉感知模块的实践与创新

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引入一、百度Apollo视觉感知模块概述二、启动感知模块步骤一&#xff1a;进入 Docker 环境并启动 Dreamview步骤二…

HOOPS Exchange导入数据时如何使用CATIA缓存选项?

1、什么是CATIA缓存选项和CGR文件&#xff1f; CATIA V5默认的工作方式是加载几何图形。加载大型程序集时&#xff0c;这可能会导致性能下降&#xff0c;因为所需的内存很重要。 在这种情况下&#xff0c;我们可能需要使用缓存选项。这将生成仅包含曲面细分数据而不包含几何图…

Docker容器---docker-Consul部署

一、Docker-consul简介 1、概述 consul是google开源的一个使用go语言开发的服务管理软件。支持多数据中心、分布式高可用的、服务发现和配置共享。采用Raft算法&#xff0c;用来保证服务的高可用。内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value存储、多…

【Hadoop】-Hive客户端:HiveServer2 Beeline 与DataGrip DBeaver[14]

HiveServer2 & Beeline 一、HiveServer2服务 在启动Hive的时候&#xff0c;除了必备的Metastore服务外&#xff0c;我们前面提过有2种方式使用Hive&#xff1a; 方式1&#xff1a; bin/hive 即Hive的Shell客户端&#xff0c;可以直接写SQL方式2&#xff1a; bin/hive --…

完美解决AttributeError: module ‘backend_interagg‘ has no attribute ‘FigureCanvas‘

遇到这种错误通常是因为matplotlib的后端配置问题。在某些环境中&#xff0c;尤其是在某些特定的IDE或Jupyter Notebook环境中&#xff0c;可能会因为后端配置不正确而导致错误。错误信息提示 module backend_interagg has no attribute FigureCanvas 意味着当前matplotlib的后…

数智新重庆 | 推进信号升格 打造算力山城

2024年&#xff0c;是实现“十四五”规划目标任务的关键一年&#xff0c;高质量的5G网络、强大的AI能力作为新质生产力的重要组成部分&#xff0c;将有效赋能包括制造业在内的千行万业数字化化、智能化、绿色化转型升级&#xff0c;推动融合应用新业态、新模式蓬勃兴起&#xf…

【javaWeb项目】基于网页形式,通过浏览器访问的java应用程序,就称为javaweb程序

JavaWeb前端 第一章 1、javaWeb是什么 //基于网页形式&#xff0c;通过浏览器访问的java应用程序&#xff0c;就称为javaweb程序2、web程序的分类 //1、静态web程序特点&#xff1a;网页上的内容是固定不变的&#xff0c;不能动态加载&#xff0c;例如web前端//2、动态web程序…

linux 搭建知识库文档系统 mm-wiki

目录 一、前言 二、常用的知识库文档工具 2.1 PingCode 2.2 语雀 2.3 Tettra 2.4 Zoho Wiki 2.5 Helpjuice 2.6 SlimWiki 2.7 Document360 2.8 MM-Wiki 2.9 其他工具补充 三、MM-Wiki 介绍 3.1 什么是MM-Wiki 3.2 MM-Wiki 特点 四、搭建MM-Wiki前置准备 4.1 前置…

【iOS】消息流程分析

文章目录 前言动态类型动态绑定动态语言消息发送objc_msgSendSEL&#xff08;selector&#xff09;IMP&#xff08;implementation&#xff09;IMP高级用法 MethodSEL、IMP、Method总结流程概述 快速查找消息发送快速查找的总结buckets 慢速查找动态方法解析resolveInstanceMet…

用 PyTorch 构建液态神经网络(LNN)

用 PyTorch 构建液态神经网络&#xff08;LNN&#xff09; 文章目录 什么是液态神经网络为什么需要液态神经网络LNN 与 RNN 的区别用 PyTorch 实现 LNNStep 1. 导入必要的库Step 2. 定义网络架构Step 3. 实现 ODE 求解器Step 4. 定义训练逻辑 LNN 的缺陷总结 什么是液态神经网络…

设计模式第二次测试 | 数据库连接池设计(原型模式、创建者模式、适配器模式)

需求中文如下&#xff1a;原本是英文&#xff0c;用百度翻译转换而来 我们需要设计一个工具&#xff0c;它负责创建一个与数据库软件MySQL的连接池。 连接池中有数百个连接可供客户端使用。 所有连接对象都有相同的内容&#xff0c;但它们是不同的对象。 连接对象的创建是资源密…

聊聊 ASP.NET Core 中间件(一):一个简单的中间件例子

前言&#xff1a;什么是中间件 服务器在收到 HTTP 请求后会对用户的请求进行一系列的处理&#xff0c;比如检查请求的身份验证信息、处理请求报文头、检查是否存在对应的服务器端响应缓存、找到和请求对应的控制器类中的操作方法等&#xff0c;当控制器类中的操作方法执行完成…