【Linux工具】编译器、调式器、项目自动化构建工具以及git的使用2(make/makefile和git的基本使用)

news2024/9/23 19:25:26

【Linux工具】编译器、调式器、项目自动化构建工具以及git的使用2(make/makefile和git的基本使用)

目录

  • 【Linux工具】编译器、调式器、项目自动化构建工具以及git的使用2(make/makefile和git的基本使用)
      • 背景
      • make和makefile的用法示例
      • 依赖关系
      • 依赖方法
      • 原理
      • 项目清理
      • 使用git命令行
          • 安装git
          • 创建新的仓库
          • 对远程仓库进行克隆
          • git add
          • git commit
          • git push将代码文件推送到远端
          • git其他操作

作者:爱写代码的刚子
时间:2023.7.7
前言:本篇博客主要介绍项目自动化构建工具make/makefile和git的基本使用,后面将会继续介绍他们的进阶使用,总结不易,希望能够支持刚子。下篇博客将会介绍gdb调试。

背景

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

make和makefile的用法示例

  • 首先创建一个test.c的文件在这里插入图片描述

  • 再创建makefile文件在这里插入图片描述

  • 使用vim编辑makefile文件
    在这里插入图片描述
    第一行表示文件之间的依赖关系,第二行表示依赖方法

  • 使用vim编辑test文件
    在这里插入图片描述

  • 直接使用make指令会生成test可执行程序在这里插入图片描述

  • 使用make clean会删除test这个可执行程序文件
    在这里插入图片描述

依赖关系

  • vim makefile编辑依赖关系
    在这里插入图片描述
    只要依赖关系不变,代码的顺序是可以变的。

依赖方法

  • make使用make执行依赖方法
    在这里插入图片描述
    在这里插入图片描述
    当缺少某个文件时,make会自动执行重新生成对应的文件
    在这里插入图片描述
    【问题1】对一个项目为什么不能多次使用make?
    问题现象:

【解释】:因为没有必要,如果项目很大的话,如果文件已经是最新的话,重复执行make将会耗费时间,且没什么收益。
【附加问题1】:make如何识别文件是否已经是最新的呢?
答:

  • 首先一定是源文件形成可执行程序,先有源文件才有可执行文件。一般而言,源文件的修改时间一定要比可执行文件要老。
  • 如果我们更改了源文件,历史上曾经还有可执行文件,那么源文件的最近修改时间,一定要比可执行程序要新。
    如何知道谁新谁老?
    只需比较可执行程序和源文件的最近修改时间。
  • .exe新于.c,源文件是老的,不需要重新编译。
  • .exe老于.c,源文件是新的,需要重新编译。
    【附加问题2】:一般而言,.exe的最近修改时间会等于.c的吗?
    答:
    一般不会,除非使用特殊命令强行修改。
  • stat + 文件名字显示文件的最近修改时间
    在这里插入图片描述
    这里我的iTerm设置了中文,如果是英文的话:
    Access:表示最近访问时间,如cat、vim、增删查改等操作都表示访问。
    Modify:表示最近对文件内容修改的时间。
    Change:表示最近对文件属性修改的时间。
    在这里插入图片描述
    在这里插入图片描述

例如:更改文件大小也会改变文件属性。

  • Access由于更改的频率的频率较高,更新的情况要写进磁盘中,当多人对磁盘进行操作时,而磁盘是外设,效率将会变得非常低,不利于Linux整机效率的提高。所以最新的Linux对Access的更改策略变为了根据Modify和Change的更新的次数和最近更新的文件的它里面维护的一个计数器来决定是否更改。

  • touch 文件名将文件的所有时间改为最新
    在这里插入图片描述

  • touch -m 文件名将文件Modify时间改为最新的同时也将Change的时间改为最新
    在这里插入图片描述

  • touch -a 文件名将文件Access时间改为最新的同时也将Change的时间改为最新
    在这里插入图片描述
    然后将时间转为时间戳进行比较文件的新旧。(比较Modify的最近修改时间)
    验证演示:
    更改文件的时间,使其能够再次编译:
    在这里插入图片描述

  • 时刻注意:文件 = 文件内容 + 文件属性
    【问题2】当clean放在makefile文件开头时为什么只会执行clean?
    问题现象:
    在这里插入图片描述
    在这里插入图片描述
    【解释】:make会自上向下扫描makefile,将要形成的第一个文件充当为make的默认动作。所以我们建议将clean动作放在下面。

总结:

make会自动推导makefile中的依赖关系
推导的过程是一种栈式结构
make会根据源文件和目标文件的新旧,判定是否需要重新执行依赖关系进行编译!不一定总是执行。

如果我们想要让项目文件使用make指令时总是执行如何做到?
答:可以将文件设置成伪目标文件(但是我们不建议将要形成的目标文件设置成伪目标文件)
在这里插入图片描述

在这里插入图片描述

.PHNOY修饰的文件,后面的命令将总是被执行。

原理

make是如何进行工作的呢?

  1. make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
  2. 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“test”这个文件,
    并把这个文件作为最终的目标文件。
  3. 如果test文件不存在,或是test所依赖的后面的test.o文件的文件修改时间要比test这个文件新(可
    以用 touch 测试),那么,他就会执行后面所定义的命令来生成test这个文件。
  4. 如果test所依赖的test.o文件不存在,那么make会在当前文件中找目标为test.o文件的依赖性,如果
    找到则再根据那一个规则生成test.o文件。(这有点像一个堆栈的过程)
  5. 当然,你的C文件和H文件是存在的啦,于是make会生成 test.o 文件,然后再用 test.o 文件声明
    make的终极任务,也就是执行文件hello了。
  6. 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文
    件。
  7. 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,
    而对于所定义的命令的错误,或是编译不成功,make根本不理。
  8. make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作了。

项目清理

  • 工程是需要清理的
  • 像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行, 不过,我们可以显示要make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重编译。
  • 但是一般我们这种clean的目标文件,我们将它设置为伪目标,用 .PHONY 修饰,伪目标的特性是,总是被执行的。
    建议将清理这类工作设置成伪目标。
    【附加1】:还可以将test写成$@ 将test.c写成 $^
    在这里插入图片描述
    在这里插入图片描述
    【附加2】:如果不想让命令在make的时候显示出来我们可以在命令前带@
    在这里插入图片描述

在这里插入图片描述

使用git命令行

安装git

在linux上输入yum install git指令(需要root权限)

创建新的仓库

在这里插入图片描述
在这里插入图片描述

对远程仓库进行克隆
  • git clone +仓库地址将远端仓库进行克隆
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    注意名字不要带前面的@
    在这里插入图片描述
git add

利用cp指令将需要push的文件拷贝到当前仓库目录:
在这里插入图片描述

  • git add .或者git add +文件将仓库没有的文件添加到仓库的暂存区
    在这里插入图片描述
git commit

在这里插入图片描述
注意日志部分一定要详细写,要写准确一点。
第一次使用git可能会遇见以下问题:
在这里插入图片描述
【解决办法】:
输入提示的指令,并填入自己的邮箱和姓名,因为gitee可能要对代码进行溯源。
在这里插入图片描述

git push将代码文件推送到远端

在这里插入图片描述
在这里插入图片描述

git其他操作
  • git log查看提交记录
    在这里插入图片描述
  • git status查看提交状态
    在这里插入图片描述
    在这里插入图片描述

免密码提交教程链接

  • 编辑.gitignore文件,提交时不会提交含有该后缀的文件
    在这里插入图片描述
    这里我添加了.p和.pp后缀,提交时将忽略含有该后缀的文件。
    注意后缀前面的*不能少!!!

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

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

相关文章

Proxy-Reflect使用详解

1 监听对象的操作 2 Proxy类基本使用 3 Proxy常见捕获器 4 Reflect介绍和作用 5 Reflect的基本使用 6 Reflect的receiver Proxy-监听对象属性的操作(ES5) 通过es5的defineProperty来给对象中的某个参数添加修改和获取时的响应式。 单独设置defineProperty是只能一次设置一…

AppStorage, OnboardingView 的示例

1. AppStorage 数据简单存储的实现 /// 应用程序数据简单存储 struct AppStorageBootcamp: View {//State var currentUserName: String?AppStorage("name") var currentUserName: String?var body: some View {VStack(spacing: 20) {Text(currentUserName ?? &…

Ghostscript开源PDF库中发现关键漏洞

在Linux中广泛使用的PostScript语言和PDF文件开源解释器Ghostscript被发现存在严重远程代码执行漏洞。 该漏洞被标记为CVE-2023-3664,CVSS v3评级为9.8,影响10.01.2之前的所有Ghostscript版本,10.01.2是三周前发布的最新版本。 据Kroll公司…

深入理解netfilter和iptables

目录 Netfilter的设计与实现 内核数据包处理流 netfilter钩子 钩子触发点 NF_HOOK宏与Netfilter裁定 回调函数与优先级 iptables 内核空间模块 xt_table的初始化 ipt_do_table() 复杂度与更新延时 用户态的表,链与规则 conntrack Netfilter(结合iptable…

基于C语言设计的足球信息查询系统

完整资料进入【数字空间】查看——baidu搜索"writebug" 需求分析与概要设计 2.1 项目说明 我们小组的选题主要是面向足球爱好者,在普通社交软件的基础之上,围绕足球的主题展开设计,以便于他们能够更好的交流相关的话题&#xff…

高效编程的捷径:HbuilderX的独特之处

目录 引言HbuilderX的功能HbuilderX的优点HbuilderX的缺点总结 HBuilderX 官网 引言 在当今科技发展日新月异的时代,软件开发已成为一个极富挑战性且高需求的领域。为了在竞争激烈的市场中脱颖而出,程序员们需要掌握一系列高效编程的技巧和工具。在这个过…

谈一谈LLM在推荐域的一些理解

作者:陈祖龙(葬青) 一、前言 最近大模型真的很火,从个人到公司,各行各业都在学习大模型、总结大模型和尝试应用大模型。大模型其实不是一个新的产物,已经在NLP发展了很多年。ChatGPT的诞生,经验的效果震惊了所有人&…

ES系列--es初探

一、前言 一般传统数据库,全文检索都实现的很鸡肋,因为一般也没人用数据库存文本字段。进 行全文检索需要扫描整个表,如果数据量大的话即使对 SQL 的语法优化,也收效甚微。建 立了索引,但是维护起来也很麻烦&#xff0…

人工智能-电脑如何像人一样思考?

发展历史 在电影如 终结者、机械公敌 中,机器人为什么能够像人一样思考?其实这就是人工智能。人工智能多方面:例如人脸识别系统、肺部影响CT,手机中的美颜、垃圾邮件拦截、自动驾驶 。 上世纪30-50年代,随着计算机科…

服务器如何查库磁盘情况?

查库磁盘情况 du -h --max-depth1 ./ | sort -hr

九九乘法表案例

for循环嵌套 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</titl…

Linux5.15 Zookeeper集群 + Fafka集群

文章目录 计算机系统5G云计算第四章 LINUX Zookeeper集群 Fafka集群一、Zookeeper1.Zookeeper 概述1&#xff09;Zookeeper 定义2&#xff09;Zookeeper 工作机制3&#xff09;Zookeeper 特点4&#xff09;Zookeeper 数据结构5&#xff09;Zookeeper 应用场景6&#xff09;Zoo…

unittest与pytest自动化测试框架

引言 前面一篇文章已经介绍了python单元测试框架&#xff0c;大家平时经常使用的是unittest&#xff0c;因为它比较基础&#xff0c;并且可以进行二次开发&#xff0c;如果你的开发水平很高&#xff0c;集成开发自动化测试平台也是可以的。而这篇文章主要讲unittest与pytest的区…

大华相机接入web页面实现人脸识别

先看下效果&#xff0c;中间主视频流就是大华相机&#xff08;视频编码H.264&#xff09;&#xff0c;海康相机&#xff08;视屏编码H.265&#xff09; 前端接入视屏流代码 <!--视频流--><div id"col2"><div class"cell" style"flex: …

2023夏季营销报告新鲜出炉!(小红书平台)

夏季温度持续走高&#xff0c;大众需求也在升级。品牌如何借势和部署相关内容&#xff1f; 本期&#xff0c;千瓜推出《千瓜2023夏季营销策略数据报告&#xff08;小红书平台》&#xff08;本文非完整版报告&#xff09;&#xff0c;围绕七大行业&#xff08;美妆|个护|食品|家…

能翻译维吾尔语的软件有哪些?这几个可以用用看

能翻译维吾尔语的软件有哪些&#xff1f;在如今全球化的背景下&#xff0c;不同语言之间的沟通交流变得尤为重要。维吾尔语作为中国特有的少数民族语言之一&#xff0c;它的翻译需求日益增长。本文将介绍几款精选的维吾尔语翻译软件&#xff0c;帮助大家顺利实现跨语言沟通。 智…

creator 滑动循环展示图片 自动展示

import MyBaseView from "./MyBaseView";const { ccclass, property } cc._decorator;ccclass export default class ScrollCard extends MyBaseView {property({ tooltip: "是否自动展示" })Move_zidong: boolean true;property({ tooltip: "自动展…

【机器学习】特征降维 - 方差选择法VarianceThreshold

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 方差选择法 一、方差科普二、方差选择API三、获取数…

炎炎夏日,相约Polkadot Decoded 2023上海

​上周&#xff0c;Moonbeam现身胡志明&#xff0c;参与GM Vietnam峰会活动&#xff0c;并与Chainlink和AWS等知名公司的代表一同畅谈Web3。 这周&#xff0c;Moonbeam中文社区将出席Polkadot未来论坛上海站&#xff0c;与来自波卡生态中不同平行链的代表一同探讨波卡新一代生…

小区物业管理系统需求分析

小区物业管理系统核心在于加强管理&#xff0c;提升效率&#xff0c;降低成本。实现物业核心业务信息化&#xff0c;为员工提供流畅运营模式&#xff0c;为业主提供高品质服务&#xff0c;有助于公司做强做大&#xff0c;系统优势主要有以下几方面&#xff1a; • 服务数字化&a…