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

news2025/1/12 6:15:59

前言:在经过前面两篇学习,大家对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.coloradmin.cn/o/1635704.html

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

相关文章

跟TED演讲学英文:Innovating to zero! by Bill Gates

Innovating to zero! Link: https://www.ted.com/talks/bill_gates_innovating_to_zero Speaker: Bill Gates Date: February 2010 文章目录 Innovating to zero!IntroductionVocabularyTranscriptQ&A with Chris AndersonSummary后记 Introduction At TED2010, Bill Ga…

.NET C# ORM 瀚高数据库

SqlSugar ORM SqlSugar 是一款 老牌 .NET开源ORM框架&#xff0c;由果糖大数据科技团队维护和更新 &#xff0c;开箱即用最易上手的ORM 优点 &#xff1a;【生态丰富】【高性能】【超简单】 【功能全面】 【多库兼容】【适合产品】 【SqlSugar视频教程】 支持 &#xff1a…

判断字符串由几个单词组成(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int world 0;int i 0;char c 0;char string[81] { 0 };int num 0;//提示用户&#xff…

一个docker配置mysql主从服务器

这也就是因为穷&#xff0c;不然谁用一个docker配置主从&#xff0c;哈哈 既然成功了就记录下。过程挺折磨人的。 首先要保证你的电脑安装好了docker 为了保证docker当中主从能正常连网&#xff0c;现在docker里面创建一个网络环境 docker network create --driver bridge mysq…

C++-9

C 1.已知C风格的字符串&#xff0c;完成对字符串通过下标访问时的异常处理机制(越界访问) 2.写一个程序&#xff0c;程序包含两个类&#xff0c;类中实现一个成员函数&#xff0c;MyGetChar(), 类A中每调用一 次&#xff0c;按顺序得到一个数字字符&#xff0c;比如第-次调用得…

社交论坛问答发帖系统源码-java+vue+uniapp开发前后端

源码说明&#xff1a; 前后端分离社交论坛问答发帖BBS源码&#xff0c;社交论坛小程序|H5论坛。 下 载 地 址 &#xff1a; runruncode.com/php/19462.html 该项目是一个使用Java、Vue和Uniapp开发的前后端分离的社交论坛问答发帖/BBS项目。它包括了论坛图文帖、视频、圈子…

新唐的nuc980/nuc972的开发1-环境和源码同步

开发环境安装 1.1更新源 服务器端&#xff1a;可以参考&#xff1a;Linux替换清华源_更改清华源-CSDN博客 下面是桌面端的方法&#xff1a; 打开系统的软件中心&#xff0c;选择自己想要使用的源 更新缓存 1.2安装必须的库 apt-get install patch apt-get install libc6-dev …

SQL提升

1. SQL TOP 子句 TOP 子句用于规定要返回的记录的数目。 对于拥有数千条记录的大型表来说&#xff0c;TOP 子句是非常有用的。 **注释&#xff1a;**并非所有的数据库系统都支持 TOP 子句。 1.1 SQL TOP 语法 SQL Server 的语法&#xff1a; SELECT TOP number|percent c…

C#基础|了解对象在程序中的状态及垃圾回收机制

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 本节了解对象的生命周期及对象状态和垃圾回收机制&#xff0c;以下为学习笔记。 1、对象的生命周期 对象在内存中不断地被引用&#xff0c;被释放&#xff0c;形成了类似生命周期的过程。 2、对象在内存中的状态 对…

记一次生产事故的排查和解决

一. 事故概述 春节期间, 生产系统多次出现假死不可用现象, 导致绝大部分业务无法进行. 主要表现现象为接口无法访问. 背景为900W客户表和近实时ES, 以及春节期间疫情导致的普通卖菜场景近似秒杀等. 二. 排查过程 优先排查了info, error, catalina日志, 发现以下异常: 主要的…

一文掌握Vue依赖注入:原理、应用场景以及最佳模块化与单元测试实践,提升代码的可维护性与模块化程度

Vue 中的依赖注入&#xff08;Dependency Injection, DI&#xff09;机制通过 provide 与 inject API&#xff0c;实现了跨组件层级间的数据与服务透明传递&#xff0c;使父组件能够向其任意深度的子孙组件“注入”依赖&#xff0c;而不需要通过层层传递 props 或使用全局状态管…

搭建智能客服机器人设计流程

一、检索型机器人FAQ-Bot 在客服处理的问题中70%都是简单的问答业务&#xff0c;只要找到QA知识库中与用户当前问句语义最相近的标准问句&#xff0c;取出答案给用户就可以了。FAQ-Bot就是处理这类问题的。在没有使用深度学习算法之前&#xff0c;通常采用检索NLP技术处理。 …

如何用智能获客开启新商机?揭秘赢销侠软件的奇效

在当今数字化竞争日益激烈的商业环境中&#xff0c;企业为了生存和发展&#xff0c;必须寻找新的途径以获取潜在客户。智能获客作为一种新型的营销方式&#xff0c;正以其高效、精准的特点改变着传统的市场开拓模式。而在这个过程中&#xff0c;自动获客软件的作用愈发凸显&…

HTML:元素分类

HTML&#xff1a;元素分类 概述块级元素&#xff08;Block-level Elements&#xff09;内联元素&#xff08;Inline Elements&#xff09;替换元素&#xff08;Replaced Elements&#xff09;表单元素&#xff08;Form Elements&#xff09; 概述 HTML&#xff08;HyperText M…

Mysql从入门到精通——Mysql知识点总结(基础篇)

参考视频 黑马程序员 MySQL数据库入门到精通i 题单推荐 入门 进阶 SQL语句类型 DDL:数据定义语言&#xff0c;用来定义数据库对象(数据库&#xff0c;表&#xff0c;字段)DML:数据操作语言&#xff0c;对数据库表中的数据进行增删改DQL:数据查询语言,用来查询数据库中表的…

拓云启航 移动云全网型经销渠道合作伙伴火热招募

2024年4月28日至29日&#xff0c;2024中国移动算力网络大会在苏州召开。28 日下午大会主论坛现场&#xff0c;中国移动发布移动云全新万象算力网络生态合作计划&#xff0c;加速算力网络新质生产力落地。后续&#xff0c;移动云将依托“拓云计划”&#xff0c;招募超万家渠道伙…

JAVA前端快速入门基础_javascript入门(03)

写在前面:本文用于快速学会简易的JS&#xff0c;仅做扫盲和参考作用 本章节主要介绍JS的事件监听 1.什么是事件监听 事件:是指发生在HTML端的事件&#xff0c;主要指以下几种。 1.按钮被点击 2.鼠标移动到元素上 3.按到了键盘 事件监听:当触发了事件时&#xff0c;JS会执行相…

自动驾驶 | 仿真测试-HiL测试全解析

1.HiL 的定义 HiL&#xff08;Hardware-in-the-Loop&#xff09;硬件在环是计算机专业术语&#xff0c;也即是硬件在回路。通过使用 “硬件在环”(HiL) &#xff0c;可以显著降低开发时间和成本。在过去&#xff0c;开发电气机械元件或系统时,使用计算机仿真和实际的实验就已经…

C语言【动态内存】

1.为什么要有动态内存 我们现在掌握的内存开辟方法有&#xff1a; int val 20;//在栈空间开辟4个字节 char str[10]{0};//在栈空间开辟10个字节的连续的空间但是上述的方式有两个点要注意&#xff1a; 1.空间开辟的大小是固定的 2.数组在申明的时候&#xff0c;一定要指定数…

上位机图像处理和嵌入式模块部署(树莓派4b利用驱动实现进程数据共享)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们讨论过&#xff0c;目前在linux系统上面有很多办法可以实现多进程数据共享。这里面比如说管道&#xff0c;比如说共享内存&#xff0c;比如…