【Linux进阶之路】gcc/g++、Makefile、git

news2024/11/15 13:47:43

前言

在正式开始之前我们先补充一个知识点——普通用户提权的操作。

sudo 【指令】

在这里插入图片描述

  • 那如何将tmp1添加到信任白名单——sudoers文件 中呢?

肯定不能自己加,得超级管理员root加——第一步:切到超级用户

找到sudoers文件——/etc/sudoers

第二步:编辑此文件

vim /etc/sudoers

第三步: 在大概一百行左右会出现这样的标志。

补充小知识:

如何显示行号呢?
:set nu

在这里插入图片描述

第四步:复制粘贴修改用户名即可

在这里插入图片描述
第五步:强制保存并退出
补充:因为这个文件不具备写权限,所以得强制保存并退出。

:wq!

切换到tmp1账号再执行操作,就会看到在普通用户sudo执行whoami就会显示root的情况。
在这里插入图片描述

一、Linux的编译器——gcc/g++

安装

安装gcc指令

yum install -y gcc

安装g++指令

yum install -y gcc-c++ libstdc++-devel

基本使用

 1.我们先用vim写一段这样的代码。
在这里插入图片描述

 2.直接编译生成可执行程序。

	gcc test.c

在这里插入图片描述
这里的a.out是默认生成的可执行程序,那有没有什么指令能改最终的可执行程序的名字呢?——重定向

gcc test.c -o test

在这里插入图片描述
注意:-o选项后面一定要跟目标文件,因为重定向的意思即为将文件经过处理产生的新内容重定向到另一个目标文件。

有了这个指令,之后的预处理,编译,汇编,链接就方便讲了。

我们之前的文章讲过这些内容,就不再细讲了,主要结合指令进行使用,有兴趣自行点击查看下面的文章。

【进阶C语言】程序环境与预处理
【深度解刨C语言】预处理(全)

拓展编译的知识:
在这里插入图片描述
准备工作完成,我们开始使用指令吧!

① 将文件执行到预处理结束就停止。

指令

gcc - E test.c -o test.i

在这里插入图片描述

  • 接着我们看一下生成的文件里面有啥。
    在这里插入图片描述

②将文件处理到编译结束就停止。

指令

gcc -S test.c -o test.s

在这里插入图片描述

  • 我们看一下生成的文件里面放的是啥?
    在这里插入图片描述

③将文件处理到汇编就停止。
指令

gcc -c test.c -o test.i

在这里插入图片描述

  • 我们用vim查看一下此文件。
    在这里插入图片描述

结果是乱码,因为vim是文本编辑器,而此文件是二进制的文件,读不出来了。

我们可以用二进制方式查看。

od test.o

结果:
在这里插入图片描述

虽然是二进制形式,但我还是看不懂,害~


到这里我们预处理阶段就完成了,剩下的一个阶段是链接。

 我们首先要想清楚为什么要链接,也就是链接干了啥事?链接将函数的声明与函数的定义联系起来,比如库函数,头文件里面有函数的声明,那定义在哪呢?不就在链接时添上了么,库函数定义的地方我们称之为链接库。

 链接库分为动态链接库静态链接库

  • 动态链接库,也就是所有的程序公用一份代码,虽然方便省空间,但是一旦链接库被删,那么所有的程序将无法运行!
  • 静态链接库,就是所有程序都拷贝一份代码自己用,这样虽然库删除之后会正常运行,但是会使代码的空间异常的大,通常在几十倍到几百倍左右。

静态库的安装

gcc

yum install -y glibc-static

g++

yum install -y libstdc++-static

说明:

Linux下生成可执行程序默认使用动态库
使用静态库需要后加 -static选项。
库通常在lib64目录下,以.so.数字 为后缀。
查看可执行程序所用的库——ldd 【文件】

如何验证静态链接的空间大呢?
在这里插入图片描述

用ll指令看生成的大小
在这里插入图片描述

添加调试信息

指令

gcc test.c -g

结果:
在这里插入图片描述

二、项目自动构建化工具——make与makefile

概念讲解

 我们先来了解一下make与makefile,make是一条指令,功能是找到makefile,并执行相应的指令,makefile就是一个文本文件,里面存放的是构建项目的指令,即依赖关系和依赖方法

  • 我们为啥要学这个工具呢?

当我们需要生成可执行程序时,有一大堆的源文件,不多就几百个,你是愿意每次生成一个可执行程序都用gcc命令敲个几分钟,还是用make与makefile几秒搞定呢?答案不了了之。熟练使用这两个工具也在一定程度上提高了我们对大型项目的掌控能力同时也提高了效率

  • 有小伙伴可能会问,makefile既然是个文本文件,我们能不能用其它名字代替呢?

答案是可以的,但限制在这几个名字“GNUmakefile”、“makefile”、“Makefile”,而且优先级从前往后,推荐使用“Makefile”(比较显眼)。别的名字make可就找不到了哦!

  • makefile 和make 通常都涉及啥呢?

makefile 里面主要是处理源文件与可执行程序的关系,涉及的工具就是编译器和链接器

下面我们就来操作一下,用的还是我们上面的代码。

基本使用

① 首先我们创建一个Makefile文本文件

在这里插入图片描述
② 用vim进行编辑,添加依赖关系和依赖方法
在这里插入图片描述
补充: 每个依赖关系的下一行必须隔一个Tab键才能写依赖方法
这样简单的就写好了!我们保存并退出用一下吧。
在这里插入图片描述
用法为:make 加 需要进行的操作,即 :左边的部分 ,当然你也可以不写这样默认执行的就是第一条依赖关系对应的指令。

如何验证呢? 我们将项目清理一下。
在这里插入图片描述
直接make后面不加内容。
在这里插入图片描述
执行的就是我们在Makefile里面的第一个依赖关系里的指令。

我们再make一下行不行。

在这里插入图片描述
结果出现了这样的内容:test.exe已经是最新的了。

为啥会出现这样的内容呢?或者说这样的原理是什么?

make指令既然说,test.exe最新的,那就有对时间的比较,跟谁比较呢?肯定是源文件的时间信息比较了。怎么看时间信息呢?

指令:stat 【文件】

在这里插入图片描述
只要test.exe文件修改的时间比test.c的内容更新,那就不用修改,这是咋比较呢?还记得时间戳吗?转换成时间戳比较看谁大谁小即可。

那如果我们想要更新test.c时间呢?

指令:touch 【文件】 

在这里插入图片描述
我们再make一下。
在这里插入图片描述
此时是成功重新生成的。

那如果我们不管啥时候都想make一下且成功执行呢?

那就需要关系——.PHONY : 【目标文件】

在这里插入图片描述

我们保存并退出多次执行make。
在这里插入图片描述
这样make就不管什么时候都会执行。

但是一般我们是这样的写的~

在这里插入图片描述
这里再补充两个小操作~

①不显示make依赖关系的内容。
在这里插入图片描述

②替换——$@用于替换:左边的内容,$^用于替换 :右边的内容。

在这里插入图片描述
我们看一下效果吧:在这里插入图片描述

三、进度条小程序

基本概念

结合前面的vim 、gcc、make与makefile 我们就可以在Linux上写一个小程序了!

首先我们看一下最终版本。

在这里插入图片描述
话不多说,开干,玩的就是真实!

首先我们看一个固定的格式,分为进度条部分,显示的进度,光标,三个部分。

首先我们要解决的第一个问题就是——怎样让进度一直在同一行打印出来?

这里涉及两个概念——换行与回车。

在这里插入图片描述

这也就是说,我们在C语言的\n和键盘上的回车键其实涉及包含两个操作,回车+换行。

那回车操作怎么表示呢?\r
还有一个概念——缓冲区。

1.在程序打开时,会默认打开三个流,默认输出流(stdout),默认输入流(stdin),默认错误流(stderr)。
2.在Linux中,缓冲区我们可以理解为一个不算太大的字符数组,当这个字符数组满时,或者程序结束,或者遇到\n等会刷新缓冲区的字符时,它会自动将内容输出并重新初始化。
3. 在Linux中,当我们需要强制进行刷新时,需要fflush函数,参数为需要刷新的流,所在头文件为stdio.h。在这里我们需要刷新的流为stdout。

那这里我们就具备了写进度条的基本能力。

操作

我们先写一个倒计时稍微练练手。

在写程序之前我们需要将项目的框架先搭建好。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们先写一个倒计时。
在这里插入图片描述

OK,我们再写一个简单的进度条。

主要功能我们在processbar.c实现

在这里插入图片描述
还差一个旋转光标和颜色以及箭头的问题。

旋转光标同理——我们可以不断覆写 - | / \ 达成效果。

颜色我们这里使用的一些参数,我就在这里列出来,方便使用。

#define NONE         "\033[m"//这个算是结束标志
#define RED          "\033[0;32;31m"
#define LIGHT_RED    "\033[1;31m"
#define GREEN        "\033[0;32;32m"
#define LIGHT_GREEN  "\033[1;32m"
#define BLUE         "\033[0;32;34m"
#define LIGHT_BLUE   "\033[1;34m"
#define DARY_GRAY    "\033[1;30m"
#define CYAN         "\033[0;36m"
#define LIGHT_CYAN   "\033[1;36m"
#define PURPLE       "\033[0;35m"
#define LIGHT_PURPLE "\033[1;35m"
#define BROWN        "\033[0;33m"
#define YELLOW       "\033[1;33m"
#define LIGHT_GRAY   "\033[0;37m"
#define WHITE        "\033[1;37m"

那如何实现闪动的效果呢?我们可以在进度为偶数时打印一种颜色,为奇数打印另外一种颜色

那如何将有一个箭头呢?其实在每次写入时,多写一个箭头,下次覆盖即可。
将这些功能补充,我们的代码就是这个样子的:

头文件:
在这里插入图片描述

process.c文件
在这里插入图片描述
至于一些更偏向实际的用法这里就不多说了,我们目前所学涉及的就是一个回调函数。

四、版本控制器——git

故事背景

  • 由于Linus在维护Linux时,需要做大量的版本维护工作,为了提高效率,使用管理版本的工具迫在眉睫,前期工作得到了一家运营版本管理工具的公司的支持,但Linux维护的社区的人才过于强大,试图将此工具破解,进而想砸了这家公司的饭碗,这家公司的老板就此撤销了使用权,Linus不想再干当初的大量的活,于是便在几个星期内写了第一版开源git,并在Linux社区不断发展,因此才有了今天便捷好用的git。

  • 如今我们在国内的网站gitee以及github,都是基于git发型的商业化版本,很像我们之前说的基于Linux内核发展而来的一些Linux操作系统。

功能

  • 一款分布式的具有网络功能的版本控制软件。

基本使用

如果在Windows上使用git,可以看此教程:

gitee(码云)的注册和代码提交【手把手】
说明:看这篇文章的前提是已经安装好git了。

下面我们是在Linux下手把手教程。

  • 第一步:在gitee上注册账号并新建仓库。

在这里插入图片描述

这是我所创建的仓库。

在这里插入图片描述
C语言外,比如C++,你在初始化仓库那里将语言.gitignore设置为C++即可。

  • 第二步:在Linux上检测是否安装git软件。

指令

git --version

如果显示下图,说明已经安装了。

在这里插入图片描述
如果其它情况,我们安装一下git

root账号下执行如下命令。

yum install -y git
  • 第三步:把远端仓库拉到本地仓库

在这里插入图片描述
然后在Linux下执行如下命令。

git clone 【复制的内容】

然后输入你gitee的账号和密码,这是我的

在这里插入图片描述
输入完之后,仓库会被克隆到本地。

我这里把上面写好的Linux小程序,移到到本地仓库。

然后我们就开始将写好的小程序,上传到远端仓库。

执行指令①

git add .//这里的 . 的意思是将新增的内容添加到本地仓库

执行指令②

git commit -m "添加的文件的信息"//也就是说你干了啥

到这里可能会出现下面的信息。

在这里插入图片描述
这里我写的就是我的邮箱和账号。
在这里插入图片描述

执行指令③

git push

在这里插入图片描述
说明:如果版本过老,我们再在root账号下执行安装命令即可。

再看gitee上你的仓库有没上传东西,有没有小绿点,即可查看是否上传成功!

在这里插入图片描述
很明显,上传成功了。


实用小操作①——查看日志信息

git log

这里是我刚上传的进度条的日志:
在这里插入图片描述
实用小操作②——过滤不想要的文件

编辑此文件:
在这里插入图片描述
添加想要过滤的文件后缀:
在这里插入图片描述
保存并退出即可。

总结

 今天的分享就到这里了,如果觉得文章不错,点个赞鼓励一下吧!我们下篇文章再见

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

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

相关文章

生物信息学_玉泉路_课堂笔记_01 第一章生物信息学简介

🍅 课程:生物信息学_玉泉路_课堂笔记 中科院_2022秋季课 第一学期 🍅 个人笔记使用 🍅 2023/7/3 🍅 教材使用: 生物信息学是应用计算机科学和数学方法研究生物学问题的交叉学科。它包括了多个领域&#xf…

显示Gif菜单

需要 最近研究在底部菜单中加入gif播放。这样显得高级一些。研究了一些技术方案,现在写篇博客,沉淀一下。 效果 实现 通过Glide实现。虽然android官方有AnimatedImageDrawable 但是只支持API28以上,也就是android9.0以上的手机。兼容性太差…

怎样做好客户自助服务?

在当前高速发展的信息化时代,人们已经习惯了即时满足的方式。对于品牌来说,当客户遇到问题时,他们希望能够获得即时细致的解答。如果客户需要等待很长时间才能获取答案,他们的满意度就会降低。因此,企业是否提供客户自…

flutter开发实战-自定义Switch开关控件Widget

flutter开发实战-自定义Switch开关控件 在flutter中实现自定义Switch,主要实现类似IOS的UISwitch样式的开关控件 一、效果图 二、实现Switch开关的Widget 实现自定义Switch的Widget,主要实现交织动画。 交织动画 有些时候我们可能会需要一些复杂的动画…

apache 安装配置 基础篇(二)

在使用Apache时,配置虚拟主机可以允许一个单一的Apache服务器提供不同的网站、域名或IP地址。 Apache虚拟主机的一个重要作用是更好的网站管理能力。当一个虚拟主机被创建时,您可以轻松地分配不同的域名和IP地址,设置不同的目录、文件和权限…

【电影推荐系统】基于 ALS 的协同过滤推荐算法

目录 目的 用户电影推荐矩阵主要思路如下 1 UserId 和 MovieID 做笛卡尔积,产生(uid,mid)的元组 2 通过模型预测(uid,mid)的元组。 3 将预测结果通过预测分值进行排序。 4 返回分值最大的 …

js debugger的两种方式

第一种:在js代码中加上debugger class ReactiveEffect {constructor(fn, scheduler) {this.fn fn;this.scheduler scheduler;this.active true;this.deps [];console.log("创建 ReactiveEffect 对象");}run() {debugger; console.log("run…

Spring高手之路8——Spring Bean模块装配的艺术:@Import详解

文章目录 1. Spring手动装配基础2. Spring框架中的模块装配2.1 Import注解简单使用 3. Import模块装配的四种方式3.1 Import注解的功能介绍3.2 导入普通类与自定义注解的使用3.3 导入配置类的策略3.4 使用ImportSelector进行选择性装配3.5 使用ImportBeanDefinitionRegistrar进…

指针进阶详解

目录 指针基本概念 1.字符指针 2.指针数组 3.数组指针 对数组名的理解 小结 指针基本概念 在初阶指针中我们了解到一些指针的基本概念: 1.指针就是个变量,用来存放地址,地址唯一标识一块内存 2.指针的大小是固定的4/8个字节(32位/64位平台&…

详解c++---哈希封装

目录标题 哈希桶的代码哈希桶的修改迭代器的实现const迭代器 哈希桶的代码 通过前面的学习大家应该能够很容易的写出下面的代码&#xff1a; #pragma once #include<iostream> #include<vector> using namespace std; template<class K,class V> struct Ha…

2023年互联网行业研究报告

第一章 行业概况 互联网行业是一个广泛的领域&#xff0c;包括所有利用互联网技术进行商业活动的企业和组织。这个行业的核心是互联网&#xff0c;一个全球性的网络&#xff0c;连接着数以亿计的计算设备和用户&#xff0c;使他们可以共享信息、资源和服务。 互联网行业包括网…

apache 安装配置 基础篇(-)

download 地址 apache下载 ApacheHaus是免安装的&#xff0c; 然后解压上面的文件&#xff0c;把里面 因apache 默认端口是80&#xff0c;如果这个端口被占用&#xff0c;apache服务是启动不起来的 netstat -ano|findstr 80 apache 修改端口号 创建apache服务 在apa…

ESP32-H2 固件烧录需满足的硬件环境整理

ESP32-H2 默认通过 UART0 &#xff08;即 TXD&#xff08;GPIO24&#xff09;和 RXD&#xff08;GPIO23&#xff09;&#xff09;下载固件。 Windows 下可使用 Flash download tool 工具来下载编译后的 bin 文件&#xff1b; 运行 flash_download_tool.exe 的文件 选择开发…

SkyEye处理器仿真系列:龙芯2K1000处理器

​SkyEye简介&#xff1a; 天目全数字实时仿真软件SkyEye作为基于可视化建模的硬件行为级仿真平台&#xff0c;能够为嵌入式软件提供虚拟化运行环境&#xff0c;开发、测试人员可在该虚拟运行环境上进行软件开发、软件测试和软件验证活动。小到芯片&#xff0c;大到系统&#…

win10 DBeaver (升级)下载、安装、彻底卸载

DBeaver &#xff08;升级&#xff09;下载及安装 一、DBeaver 下载二、安装三、DBeaver 的基本使用 - mysql连接四、DBeaver 彻底卸载 DBeaver是一种通用数据库管理工具&#xff0c;适用于需要以专业方式使用数据的每个人&#xff1b;适用于开发人员&#xff0c;数据库管理员&…

苹果笔买原装的还是随便买?便宜好用的手写笔推荐

自从ipad和其他的平板电脑都搭配上了电容笔以后&#xff0c;电容笔很好地取代了我们的手指&#xff0c;书写的效率就大大提升了&#xff0c;但由于苹果原装电容笔的价格不够人性化&#xff0c;一直高居不下给普通人带来了很大的负担&#xff0c;特别是对于学生们来说&#xff0…

QT DAY1

做一个窗口界面 #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow) {ui->setupUi(this);//设置窗口标题、图标this->setWindowTitle("Fly_Chat")…

6、Flume安装部署

按照采集通道规划&#xff0c;需在hadoop102&#xff0c;hadoop103&#xff0c;hadoop104三台节点分别部署一个Flume。可参照以下步骤先在hadoop102安装&#xff0c;然后再进行分发。 1、Flume入门 1.1、 Flume安装部署 1.1.1、 安装地址 &#xff08;1&#xff09; Flume官…

全网最牛,Web自动化测试Selenium八大元素定位实战(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 安装Selenium和下…

BFT 最前线|OpenAI暂时下线ChatGPT”浏览“功能;Stability AI CEO:5年内,人类程序员将不复存在

原创 | 文 BFT机器人 AI视界 TECHNOLOGY NEWS 01 Open AI暂时下线ChatGPT“浏览”功能 日前OpenAI方面宣布&#xff0c;面向ChatGPT Plus用户的"浏览"功能会在某些情况下出现故障&#xff0c;因此已于7月3日暂时禁用了这一功能。该功能是为了提高ChatGPT的搜索体验…