sudo文件的配置以及gccg++工具的使用

news2025/2/25 11:17:12

目录

   sudo无法运行的原因

   sudoers文件的配置

   1.切换到root账户

  2.打开sudoers文件

​编辑

  3.开始文件配置

  gcc&g++工具的使用

    预处理

   为什么要有条件编译呢?

  gcc预处理文件

    编译

    汇编

    链接

    动态库和静态库

   sudo无法运行的原因

  之前我们说过,普通用户在很多情况下有很多权限方面的限制。要想执行一定的权限就要切换到root用户。但是每一次需要的时候都切换到root用户又会显得很麻烦,所以就有了sudo暂时提升用户权限的使用方法。但是我们会发现一个很奇怪的现象:

  需要我们这个用户自己的密码?那么这么来说岂不是人人都可以使用sudo指定提升权限?那权限的设计还有什么作用呢?

  当我们输入完成密码之后我们就会发现,由sudo提升权限的指令并没有运行。

  而是显示了Liu is not in the suders file 这样一条提示。这是因为要想使用sudo提升命令的权限确实只需要自己的密码。但是在使用之前必须保证我们的用户已经被列入为可以信任的用户的列表当中,否则即使输入了密码也无法正常运行。

  这个时候就需要我们手动配置sudoers文件,将我们的用户添加进入指定的文件当中我们的指令就可以正常的运行了。

   sudoers文件的配置

  配置文件虽然听起来很麻烦,其实不然。我们只需要使用之前学过的vim工具打开etc目录下的sudoers文件进行添加指定的内容即可。执行步骤如下:

   1.切换到root账户

  

  我们第一步需要使用su命令将用户切换到root。

  2.打开sudoers文件

  输入vim /etc/sudoers 指令打开 sudoers 文件。

  3.开始文件配置

  打开的文件或许会有很多我们看不懂的内容,但是我们只需要找到上述格式的内容即可。我们将root那一行的内容复制一遍,放到下边。之后进入插入模式,将root修改成为我们想要添加的用户即可。

  在添加完毕之后,我们就可以返回我们的用户进行测试sudo命令在配置过后是否可以正常使用。

  在配置完文件之后我们尝试使用sudo命令创建了一个文件,显示文件的创建者和所属组均为root。这就说明我们已经成功的将用户执行的命令权限提升到了root级别。

  gcc&g++工具的使用

  我们之所以能够在Linux平台上面运行以及编写C++代码和C语言代码这是因为我们的系统自动装载了gcc和g++编辑器。其作用就相当于我们在Windows平台上面下载的 VS2019 。在下载的时候会自动安装一系列的配置文件,比如一系列的头文件和库文件。我们可以通过这些头文件以及库文件让我们的代码正常运行。

  其中一段代码要想正常经过编译生成可执行文件。那么就一定需要经过预处理,编译,汇编,链接。这四个步骤。在这四个步骤会分别生成不同的文件,比如预处理会生成一个以 .i 为后缀的文件,编译会生成一个以 .s 为后缀的文件,最后通过汇编生成一个 .o 为后缀的文件。得到 .o 文件之后再通过链接的步骤,找到我们的库文件,即可生成最终的可执行程序。

    预处理

  在预处理的步骤当中我们会对代码进行很多很小的修改,例如:去注释,头文件展开,条件编译,以及宏替换。

  去注释很容易理解,作为一名合格的程序员,在编写代码的时候为了增加代码的可读性,我们需要适当给代码添加注释。而我们添加的注释会被编译器自动忽略的原因就在预处理这一步。我们的注释在预处理的步骤当中已经被去掉了。

  头文件的展开,其实顾名思义就是代码在预处理的时候为了查找方便,会将头文件当中所有的东西都直接导入到我们的文件当中。

  条件编译是我们之前学过的 #ifdef 之类的操作符,起作用就相当于一个if_else语句,有了条件编译就可以通过是否进行宏定义而选择性的编译一些东西。

  宏替换就是将我们在 #define 当中定义的变量更换成指定的内容,比如:#define int DataType 我们在后面的代码的编写当中就可以使用 DataType 进行替换 int 。我们所有的自定义的元素都会在预处理这个步骤更改成为可以被计算机认识的内置类型。

   为什么要有条件编译呢?

  相信大家肯定会条件编译这个功能会很好奇:为什么会需要条件编译呢?举一个简单的例子:我们在生活中经常会遇到一种情况 : 使用一个软件通常会分为会员用户以及普通用户。会员用户会比普通用户多出很多的功能。那么我们的代码需要写两份吗?一份给普通用户,一份给会员用户。

  不,并不需要。这个时候就需要用到了条件编译。我们可以将会员用户的功能放到条件编译的部分,只有在定义了特定的元素之后才可以被编译执行。所以当我们升级成为会员用户的时候,只需要为普通用户多定义一个变量即可。这就是条件编译的使用方式,在预处理这一个步骤我们的系统会做出判断,将不需要进行编译的部分删去,只留下需要使用的部分。

  gcc预处理文件

  作为编译文件的工具gcc可以将生成可执行程序的四个步骤分别执行,我们可以通过执行指定的代码进行验证我们上述预处理所进行的四个内容。

  命令为:gcc -E test.c -o test.i  文件对比结果如下:

  经过预处理之后,我们可以发现原本仅仅是很简短的代码变得很长。这就是我们头文件展开之后的结果。我们在原文件当中所标记的注释也消失了。并且文件自动替换了我们宏定义的NUM变量,并将选择编译没有使用的分支自动删除。上图中的内容可以很好的证明我们上面所讲述的内容。

    编译

    相对于预处理来说编译所进行的操作就很少了,在编译阶段我们的编译器会将我们上述转换得到的代码转换成为汇编代码,这样就更加接近机器语言了。同样的我们需要使用特定的指令:

  指令如下:gcc -s test.i -o test.s   编译所产生的文件我们通常以 .s 为结尾作为标志。产生的文件如下:

    汇编

   在汇编的过程中会将我们上一个步骤所生成的汇编代码重新进行处理,之后生成可以完全被机器所接受的二进制机器文件代码。需要使用的指令如下:

  指令为:gcc -c test.s -o test.o  通常情况下我们将汇编步骤生成的文件以 .o 为后缀进行命名,文件的内容如下:

   由于二进制码以文本的形式打印出来我们并不认识,所以并不需要着重注意。

    链接

  按照道理来说上述步骤已经将我们的代码转换成为机器可以识别的二进制码,但是为什么还要有链接这个步骤呢?

  这就需要和我们之前的头文件相关的知识联系起来了,我们知道的是在预编译的步骤里会将头文件当中的内容展开放到我们书写的代码当中,但是一个头文件那么多函数只会有800多行吗?肯定不会。在头文件当中存储的仅仅是一个函数的声明,其真正意义上的实现就像是我们平时编写多文件程序的时候一样,会存储在一个 .c 文件当中。而类似于这种 .c 文件就叫做我们的库文件。

  库文件分为动态库和静态库,在链接这个步骤当中我们会通过头文件当中的函数的声明以及链接找到指定的库文件,之后我们的程序才可以成功的实现函数的调用。最后链接步骤的指令如下:

  gcc test.s -o test.exe   经过编译之后会生成一个可执行程序,运行可执行程序之后就会得到我们想要的运行结果。测试结果如下:

    动态库和静态库

  在链接的时候我们提到了静态库和动态库,在那一部分我们只是简单的介绍了库文件的作用,那么接下来我们再来详细介绍一下什么是静态库和动态库,以及这两者的区别。

  为了增加函数的封装性,在头文件当中我们通常只会使用函数的声明进行函数的定义。而实现就会在另一个文件当中。实质上在头文件当中保存的只是我们相应函数的链接,我们可以通过链接找到函数实现的地方。之后通过类似于函数指针的形式找到并使用指定的函数。

  根据我们特定的函数是否在计算机当中存储就可以将库分为动态库和静态库。

  动态库类似于一个云端链接的形式,要想使用指定的内容,需要从链接找到“云端”,之后在“云端”当中直接使用,不要求在计算机当中存储代码。

  而静态库就类似于我们在计算机当中手动编写的一个新的 .c 文件,我们可以在计算机当中真实的找到一个 .c 文件。不要求访问“云端”等操作的进行。

  相比于静态库,动态库有很大的优势。因为如果使用静态库的话会占用很大的空间,是我们生成的可执行程序的体积变得很大。进而造成很多不必要的影响,所以我们如果想使用的话最好使用动态库。

  静态库和动态库的验证:

  使用特定的指令进行重新编译生成一个静态的可执行程序。我们可以发现,生成的可执行程序文件扩大了大约100倍左右。

  同样的我们还可以通过 ldd  指令查看一个可执行程序的生成时采用的动态库还是静态库:

  如果是动态库链接生成的可执行程序使用ldd命令查看文件就会显示动态链接的地址,如果是静态库链接形成的文件就会什么都不显示。

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

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

相关文章

[Linux入门]---进程的概念

文章目录 1.进程的概念①描述进程-PCB②task_struct-PCB的一种③task_ struct内容分类 2.查看进程3.通过系统调用获取进程表示符4.通过系统调用创建进程---fork初识 1.进程的概念 在我们的电脑开机的时候,操作系统会被加载到内存中,点击多个应用进行时&a…

【校招VIP】前端js语言考点之ES6

考点介绍: es6就是es5的升级版,es5是js的通用标准,绝大多数浏览器都支持其语法,但是es6则不同,如果es6的代码需要在浏览器上运行,那就先将es6转换为es5。如果在es6中使用模块化机制,需要将个模块…

OAuth2.0客户端基于oltu搭建

之前提到了cas-server这个项目其本身是支持OAuth2.0协议的,因此我们可以简单搭建一个OAuth客户端,本次使用到的是Apache的oltu oltu介绍 Apache Oltu 是一个开源的 OAuth 库,用于帮助开发者实现 OAuth 1.0 和 OAuth 2.0 协议。OAuth 是一种用于授权和认证的协议&a…

Learn Prompt- Midjourney 图片生成:Image Prompts

Prompt 自动生成 前不久,Midjourney 宣布支持图片转 prompt 功能。 原始图片​ blueprint holographic design of futuristic Midlibrary --v 5Prompt 生成​ 直接输入 /describe 指令通过弹出窗口上传图像并发送,Midjourney 会根据该图像生成四种可…

图片无损放大在线工具分享

在论文写作过程中 忘了将图片保存330dpi怎么办?截图的图片放论文,十分模糊怎么办? 图片模糊、不清晰转高清的神器 【传送门】 推荐理由:无广告、速度快、在线版,随时用。

数据结构之【泛型】

泛型:定义阶段不明确具体类型,产生对象时明确具体类型。 //Object是Java中的最高参数统一化,能够接受所有的引用类型; //有了包装类的自动拆装箱之后,Object还能够接收基本类型数值(自动装箱) …

前端JavaScript中的 == 和 ===区别,以及他们的应用场景,快来看看吧,积累一点知识。

🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 一、等于操作符 二、全等操作符 三、区别 小结 一、等于操作符 等于操作符用两个等于号( &am…

基于微信小程序的校园餐饮配送系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言学生微信小程序端的主要功能有:配送员微信小程序端的主要功能有:商家微信小程序端的主要功能有:管理员的主要功能有:具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding&am…

单调栈和单调队列可以很简单

大家好,我是 方圆。我觉得单调栈和单调队列的题目很有特点,而且理解了它的特点能够很轻松容易地解决一系列题目,所以决定用这篇帖子记录一下,也想以此来帮助在刷同样类型题目的朋友们。如果大家想要找刷题路线的话,可以…

每日一题~组合总数III

原题链接:216. 组合总和 III - 力扣(LeetCode) 题目描述: 思路分析: 这是一个组合的问题,所以我们可以使用深度优先搜索(DFS)的方式将所有的情况都列举出来,然后将其中…

企业怎么申请OV SSL证书?

随着互联网的发展,越来越多的企业开始使用SSL证书来保护网站的安全。而OV SSL证书作为机构验证型的证书,能够重点强调网站安全、企业可信形象的网站,保密传输更加安全。那么,企业怎么申请OV SSL证书呢?接下来&#xff…

计算机视觉与深度学习-经典网络解析-GoogLeNet-[北邮鲁鹏]

这里写目录标题 GoogLeNet参考GoogLeNet模型结构创新点Inception结构,它能保留输入信号中的更多特征信息去掉了AlexNet的前两个全连接层,并采用了平均池化引入了辅助分类器 GoogLeNet GoogLeNet的设计主要特点是引入了Inception模块,这是一种…

聚观早报 | 杭州亚运开幕科技感拉满;腾讯官宣启动「青云计划」

【聚观365】9月25日消息 杭州亚运开幕科技感拉满 腾讯官宣启动「青云计划」 FF任命新全球CEO 比亚迪夺得多国销冠 iPhone 15/15 Pro销售低于预期 杭州亚运开幕科技感拉满 杭州第19届亚洲运动会开幕式23日晚在杭州奥体中心主体育馆举行,这届开幕式可谓科技感拉…

【linux进程(一)】深入理解进程概念--什么是进程?PCB的底层是什么?

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:Linux从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学更多操作系统知识   🔝🔝 Linux进程 1. 前言2. PCB初认…

Java基本数据类型只有八种?第九种告诉你

一、前言 今天看了一下Oracle官网的JVM规范,发现基本数据不止有八种。 这个东西一直都是说着八种,官网把returnAddress放在八种基本数据类型一起说的,我们可以理解为第九种! 常说的八种用于存储常见的数值和字符数据&#xff0…

计算机等级考试—信息安全三级真题六

目录 一、单选题 二、填空题 三、综合题 一、单选题

阿里云ESS弹性伸缩核心概念与基本使用

文章目录 1.ESS弹性伸缩基本概念1.1.弹性伸缩概念1.2.弹性伸缩应用场景1.3.弹性伸缩的应用模式 2.开通ESS弹性伸缩服务3.为KodCloud云盘集群创建弹性伸缩组3.1.创建伸缩组3.2.设置伸缩组的名称、类型、移除策略、健康检查3.3.设置组内实例数、冷却时间、网络类型、扩缩容策略、…

python循环判断

运算符短路逻辑python优先级 思维导图for循环 运算符 运算符含义and左边和右边同时为True,结果为Trueor左右两边其中一个为True,结果为Truenot如果操作数为True(False),结果为False(True) 短路逻辑 从左到右,只有当第一操作数的值无法确定逻辑运算的结…

电脑开机慢怎么办?这样解决快速且有效!

“明明电脑用了才没多久,为什么开机那么慢呀?经常开个机需要好几分钟,这很耽误我的工作,请问有什么方法可以解决这个问题吗?” 电脑是现代生活不可或缺的工具,然而,当我们面对电脑开机缓慢的问题…

3D目标检测实战 | 图解KITTI数据集与数据格式

目录 1 数据集简介2 传感器坐标系3 数据集下载与组织4 数据内容说明4.1 矫正文件calib4.2 图像文件image4.3 点云文件velodyne4.4 标签文件label4.5 平面文件plane 1 数据集简介 KITTI数据集是一个广泛应用于自动驾驶和计算机视觉领域的公开数据集。该数据集由德国卡尔斯鲁厄理…