[Linux打怪升级之路]-yun安装和gcc的使用

news2024/11/26 14:34:13

前言

作者小蜗牛向前冲

名言:我可以接受失败,但我不能接受放弃

如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。

本期学习目标:学习yum的基础操作,用gcc编写在vim中写好的代码,学会如何编写makefile文件,用make指令编程。

一、yum的基本操作

1、什么是yum

在回答什么是yum这个问题的时候,我想请大家思考一个小问题,平常我们在window下是怎么安装软件(app)的,一般我们是在应用商城上下载的。那么Linux和window同为操作系统,都应该是可以安装软件的,但是由于window是可视化平台,而Linux不是就不会出现我们要那个app直接点一下屏幕就可以了,Linux都是通过命令行来控制的。而其中的yum就相当于window下的应用商城,。

所以说(Linux下的各种工具)软件包和(yum)软件包管理器, 就好比 "App" 和 "应用商店" 这样的关系

2、yum的三板斧

查看软件包

通过 yum list 命令可以罗列出当前一共有哪些软件包. 由于包的数目可能非常之多, 这里我们需要使用 grep 命令只 筛选出我们关注的包.

例如:

yum list | grep lrzsz

这里补充一个小知识:rzsz 这工具用于 windows 机器和远端的 Linux 机器通过 XShell 传输文件. 安装完毕之后可以通过拖拽个的方式将文件上传过去。

注意事项: 

  • 软件包名称: 主版本号.次版本号.源程序发行号-软件包的发行号.主机平台.cpu架构.
  • "x86_64" 后缀表示64位系统的安装包, "i686" 后缀表示32位系统安装包.
  • 选择包时要和系统匹配. "el7" 表示操作系统发行版的版本.
  • "el7" 表示的是 centos7/redhat7. "el6" 表示 centos6/redhat6.
  • 最后一列, base 表示的是 "软件源" 的名称, 类似于 "小米应用商店", "华为应用商店" 这样的概念

 安装软件

通过 yum, 我们可以通过很简单的一条命令完成 gcc 的安装. 

sudo yum install lrzsz

卸载软件

这里我们去卸载gcc

sudo yum remove lrzsz

3、yum的深度思考 

上面我们知道yum怎么去查找软件包,安装和卸载软件,但是软件包又是从何处来的呢?

我们都知道在下载软件的时候都是联网的,也就说软件包并不是在本地,其实软件包是通过联网访问服务器。

那些服务器又是谁在维护,软件包又是怎么来的呢?

这就不得不说Liunx是个开源的操作系统,那么在一个操作系统中肯定要下载软件的,所以那么Liunx社区的大佬就会去维护服务器(当然不同的版本的操作系统,服务器可能不同),然后因为服务器是免费为大家提高的,所以自然会有些大佬乐于奉献去些软件包并上传到。

二、gcc的学习使用

前面我们在自己的服务器是安装的gcc,我们都知道vim仅仅只是个高级点的编辑器,他是不能完成对代码的编译链接的,这将要靠我们的gcc编译器去完成。

1、在Liunx下理解编译链接

下面我们简单回忆一下翻译的过程:

  • 预处理:这过程中我们完成对头文件的展开,去注释,对代码中的宏进行替换,进行条件编译。
  • 编译:把c语言代码转为汇编语言。
  • 汇编:这里将汇编语言在转换为二进制(这里虽然生成了计算机可识别的二进制,但是由于没有进行链接,所以仍然是不可执行的)。
  • 链接:将写好的代码和C标准库中的代码合起来。

 下面我们在Linux操作系统下体会一下编译的过程

预处理

gcc -E test.c -o mytest.i

这句代码的意思是从现在开始翻译,当到预处理阶段的做完就停下来,其中的 -o是指明生成的临时文件名称。(如果我们不指向生成的文件名称为auto.c)

编译 

gcc -S test.c -o mytest.s

这句代码表示,从现在开始程序的翻译 ,做完编译工作后就停下来。

 汇编

gcc -c test.c -o mytest.o

这句代码表示,从现在开始程序的翻译 ,做完汇编工作,讲汇编语言转化为二进制语言后就停下来。

 链接

gcc mytest.o  -o mytest.c

这里就对二进制文件进行链接过程,生成可执行文件。

 2、函数库

虽然我们了解从上面了解到对程序翻译过程,但是在链接过程中我们要讲C标准的库函数和我们写的代码合并到一起。为了更好的理解,我们还需要知道库函数是分为动态库和静态库这二类的。

静态库和动态库

  • 静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也 就不再需要库文件了。其后缀名一般为“.a”。
  • 动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时 链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”,

那么我们在Linux下进行的链接是动态库还是静态库呢?

 下面我们可以通过file命令来查找一下文件信息:

 而在此系统的动态库的名称为libc.so.6。

 如果我们要让文件链接静态库怎么做呢?

 这里我们只要在链接阶段加上 -static就可以了,但是发现报错了是不能执行这个命令,这是因为我们可能没有安装静态库只要我们安装一下就可以了(sudo yum -install -y glibc-static)。

3、makefile和make

首先我们要明白makefile是一个文件,make是一个配合makefile使用的命令。

背景知识

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

为了更好的理解makfile和make,我们在Linux写个小项目:进度条。

process.h

#pragma once
#include<stdio.h>
#include<unistd.h>
#include<string.h>
//定义进度条的多种展示形式
const char style[] = {'#','$','>','-','*'};
#define N 2              

process.c

 #include"process.h"

 int  main()
{
    int i = 0;
	//给一个字符数组存放进度条
    char bar[101];
	//这里给一个进度条在直观跑的形态
	const char* label = "|\\-/";
	memset(bar, 0, sizeof(bar));
	//展示进度条
	while (i <= 100)
	{
		printf("[%-100s][%d%%][%c]\r", bar, i, *(label + (i % 4)));
		//这里的是为刷新缓冲区                                                                                                                                                 
		fflush(stdout);
		bar[i++] = style[N];
		usleep(100000);
	}
	printf("\n");
	return 0;
 }

这里我们写好了代码,正常情况下,我们只要用gcc编译器编译就好了,但为了实现项目的自动化构建,所以我们就要使用makefile和make。

那么我们要在makefile文件定义什么呢?

我们主要在文件中定义清楚,依赖关系和依赖方法。

下面我将以进度条小项目进行分析:

上面我们可以看到由于我们要生成的process是依赖于proccess.c生成的,所以我们在第1行定义了文件之间的依赖关系。而依赖的方式我们是通过gcc编译器生成的。

那么下面的clean又是上面呢?

这其实是和make是相反的,调用make命令,会编译文件,而调用make clean会清理文件。

进度条

 

 

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

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

相关文章

Java:外包Java项目有什么好处?

Java已经成为众多解决方案的通用开发语言&#xff0c;包括web应用、游戏、软件开发等等。超过710万全球的Java程序员都在忙着为业界下一个最好的应用程序编码。 随着企业努力在当今的全球市场中保持竞争力&#xff0c;对Java项目外包的需求不断增加。 以下是你的企业通过外包Ja…

python基于PHP+MySQL的论坛管理系统

互联网给了我们一个互通互信的途径,但是如何能够更加高效的进行各种问题的分享和交流是很多人关心的问题,市面上比较知名的一些分享交流平台也很多,比如百度的贴吧,知乎等高质量内容分享平台,本系统是一个类似这样的论坛分享系统 随着互联网的发展人们分享和交流的分享也变的越…

leetcode刷题(128)——1575. 统计所有可行路径,动态规划解法

leetcode刷题&#xff08;127&#xff09;——1575. 统计所有可行路径&#xff0c;DFS解法 给你一个 互不相同 的整数数组&#xff0c;其中 locations[i] 表示第 i 个城市的位置。同时给你 start&#xff0c;finish 和 fuel 分别表示出发城市、目的地城市和你初始拥有的汽油总…

【CSS】CSS字体样式【CSS基础知识详解】

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 本文章收录于专栏 【CSS】 【CSS专栏】已发布文章 &#x1f4c1;【CSS基础认知】 &#x1f4c1;【CSS选择器全解指南】 本文目录【CS…

物联网感知-光纤光栅传感器技术

一、光纤光栅传感技术 光纤光栅是利用光纤材料的光敏性&#xff0c;通过紫外光曝光的方法将入射光相干场图样写入纤芯&#xff0c;将周期性微扰作用于光纤纤芯&#xff0c;在纤芯内产生沿纤芯轴向的折射率周期性变化&#xff0c;从而形成永久性空间的相位光栅&#xff0c;其作用…

MySQL数据库的基本操作及存储引擎的使用

大家好呀&#xff01;我是猿童学&#x1f435;&#xff0c;最近在学习Mysql数据库&#xff0c;给初学者分享一些知识&#xff0c;也是学习的总结&#xff0c;关注我将会不断地更新数据库知识&#xff0c;也欢迎大家指点一二&#x1f339;。 目录 一、常用的MySQL语句 二、创建…

使用ThinkMusic网站源码配合cpolar,发布本地音乐网站

1、前言 在我们的日常生活中&#xff0c;音乐已经成为不可或缺的要素之一&#xff0c;听几首喜欢的音乐&#xff0c;能让原本糟糕的心情变得好起来。虽然现在使用电脑或移动电子设备听歌都很方便&#xff0c;但难免受到诸多会员或VIP限制&#xff0c;难免让我们回想起音乐网站…

【JavaScript】常用内置对象——数组(Array)对象

文章目录什么是数组创建数组访问数组数组常用方法和属性投票传送门什么是数组 数组&#xff08;Array&#xff09;是最基本的集合类型&#xff0c;由于JavaScript是弱类型语言&#xff0c;因此JavaScript的数组和大多数语言的数组有所区别。在大多数语言中&#xff0c;当声明一…

ubuntu 20.04 qemu u-boot-2022.10 开发环境搭建

开发环境 ubuntu 20.04 VMware Workstation Pro 16 基于qemu&#xff08;模拟器&#xff09;&#xff0c;vexpress-a9 平台 搭建 u-boot-2022.10 (当前最新版本&#xff09; 准备工作 u-boot下载&#xff0c;下载最新稳定版本&#xff0c;当前为 u-boot-2022.10&#xff0…

代码随想录49——动态规划:121买卖股票的最佳时机、122买卖股票的最佳时机II

文章目录1.121买卖股票的最佳时机1.1.题目1.2.解答1.2.1.贪心算法1.2.2.动态规划2.122买卖股票的最佳时机II2.1.题目2.2.解答1.121买卖股票的最佳时机 参考&#xff1a;代码随想录&#xff0c;121买卖股票的最佳时机&#xff1b;力扣题目链接 1.1.题目 1.2.解答 1.2.1.贪心算…

第七节:类和对象【一】【java】

目录 &#x1f9fe;1. 面向对象的初步认知 1.1 什么是面向对象 1.2 面向对象与面向过程 &#x1f4d5;2. 类定义和使用 2.1 简单认识类 2.2 类的定义格式 2.3 课堂练习 &#x1f392;3. 类的实例化 3.1 什么是实例化 3.2 类和对象的说明 3.3练习 &#x1f9fe;1. 面…

Hbase2.4.11安装

Hbase2.4.11安装 文章目录Hbase2.4.11安装一、前期准备二、安装三、配置文件(一)添加环境变量&#xff08;二&#xff09;修改hbase配置文件1.修改hbase-env.sh 中内容2.在hbase-site.xml中添加以下内容3. 编辑regionservers四、分发文件到Hadoop2、Hadoop3中一、前期准备 hba…

SpringBoot+Vue实现前后端分离的学生选课系统

文末获取源码 开发语言&#xff1a;Java 使用框架&#xff1a;spring boot 前端技术&#xff1a;JavaScript、Vue.js 、css3 开发工具&#xff1a;IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库&#xff1a;MySQL 5.7/8.0 数据库管理工具&#xff1a;phpstudy/Navicat JD…

浏览器无痕模式有什么作用,手机浏览器开启无痕模式的方法

在我们的手机基本上都安装了浏览器&#xff0c;当我们在上网过程中&#xff0c;不想浏览记录被留下&#xff0c;那么开启无痕模式是非常有必要的。那么&#xff0c;浏览器的无痕模式有什么作用&#xff0c;手机浏览器如何开启无痕模式呢&#xff1f;下面教大家如何在手机浏览器…

HECTF2022

今年是第三次参加HECTF&#xff0c;成绩不是很好wp随便看看就好了 文章目录Misc咦~小鲨鱼来喽舞者的秘密你把我flag藏哪去了?来玩捉迷藏呀我的手要不行辣2022HECTF调查问卷Crypto流动的音符matrixezrsamixtureReverseapk贝斯helloiosrunWeb迷路的小狮擎天注Pwn真签到Misc 咦~…

马斯克的这波神操作,让我意识到保持写代码的能力有多重要

作为一个在IT行业摸爬滚打了多年的老油条&#xff0c;我是越来越看不懂现在的互联网行业了。 至少曾经我听过太多人吐槽写代码的永远干不过写PPT的&#xff0c;并且在现实工作中验证过也确实如此&#xff0c;但是老马的这一波骚操作&#xff0c;让推特工程师打印出最近30-60天…

《这!就是街舞》,好综艺还是好生意?

01.始于热爱&#xff0c;火于流量&#xff0c;不止综艺&#xff0c;这就是街舞 “每个人生而不同&#xff0c;不需要被包裹成别人需要的面孔。我就是我&#xff0c;既不傲慢&#xff0c;也不卑微。” ——李承弦 这段来自综艺《这&#xff01;就是街舞》第五季中节目对于李承…

ES6的Promise详解

文章目录前言一、Promise的概念二、使用Promise创建 PromisePromise 常用方法Promise.prototype.then()Promise.prototype.catch()all()链式调用前言 本篇文章主要介绍了ES6语法中的Promise对象的使用详解,promise对象是JS进阶学习中的重要知识点&#xff0c; 如果本文对你有所…

JavaScipt基础(持续更新三)

JavaScipt基础 JavaScipt基础 九、对象&#xff08;Object&#xff09; 9.1什么是对象 9.2JavaScript中的对象 9.3如何得到一个对象 9.4this的指向 9.5对象的使用 十、标准库对象&#xff08;内置对象&#xff09; 10.1Math对象 10.1.1常用属性和方法 10.1.2案例 1…

8年测试经验,简单易懂的讲解一下什么是自动化测试?

自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。通常&#xff0c;在设计了测试用例并通过评审之后&#xff0c;由测试人员根据测试用例中描述的规程一步步执行测试&#xff0c;得到实际结果与期望结果的比较。在此过程中&#xff0c;为了节省人力、时间或硬件资…