Linux系统编程学习 NO.7 ——sudo配置、编译器的使用

news2024/11/24 20:24:33

引言:

现在是北京时间2023年6月14日8点16分,期末考试在即,重心可能得转移到考试上了。不过想到马上就可以回家陪家人过端午节,还是非常开心的。放暑假了就可以好好陪家人了。尝试一下换个环境复习吧,洗漱一下就去图书馆了。
在这里插入图片描述

sudo的介绍和配置

在之前介绍yum工具时,普通用户需要sudo对指令进行提权才能下载或卸载软件。那么sudo是什么呢?sudo要如何配置呢?下面且听我的介绍。

什么是sudo?

sudo是一个Linux/Unix操作系统中的命令,用于以超级用户(即root用户)的身份执行命令或访问系统资源。一般来说,普通用户无法访问某些系统资源或执行某些系统命令,而使用sudo命令可以暂时提升用户权限以执行这些操作。使用sudo命令需要输入当前用户的密码以确认身份。

没有sudo权限的现象

在这里插入图片描述

sudo的配置

第一步,用root账户打开sudoers配置文件

vim /etc/sudoers

在这里插入图片描述
第二步,将root那一栏的信息拷贝粘贴一份并在用户名处改成你要配置的用户,随后在低行模式下写入即可。
在这里插入图片描述
下面简单验证一下。
在这里插入图片描述

gcc/g++编译器的使用

gcc/g++基本使用

gcc 源文件.c -o
g++ 源文件.cpp/源文件.c -o

-o后面跟一个自定义程序的名字,如gcc 源文件.c -o mytest,那么编译器在生成可执行程序后就不会以默认的a.out来命名这个可执行程序,而是用mytest来作为可执行程序的名称。
在这里插入图片描述
在这里插入图片描述
g++编译cpp文件后,默认产生的可执行程序也是a.out。这说明gcc和g++是同根同源的。那么gcc可以编译cpp文件吗?g++可以编译c文件吗?
结论:gcc不能编译.cpp后缀的源文件。
在这里插入图片描述
结论:g++可以编译.c后缀的c源文件。但是平时建议使用gcc编译.c后缀的源文件。
在这里插入图片描述

程序的翻译过程

程序的翻译过程大致分为四种,分别是预处理、编译、汇编以及链接。下面我就简单给各位介绍一下这四种编译过程。

gcc的预处理过程

预处理是负责对源代码进行处理。此时,会完成以下工作:头文件展开宏替换注释删除以及条件编译等工作。处理完上述工作后,编译器会生成一个新的文本文件,以.i作为扩展名。下面我就在Linux环境中的gcc编译器下进行简单的演示。

gcc -E 源文件.c -o 新的文本文件.i

这里的-E选项其实就是告诉编译器,你翻译我的源代码,将预处理的工作完成后就停下来。
在这里插入图片描述
在这里插入图片描述
由于我们没有定义DEBUG宏,所以在条件编译后,.i文件中就是printf(“release\n”);这行代码。既然gcc可以进行一些列的文本操作,相应的也可以进行宏定义。下面就简单演示一下

gcc -E test.c -o test.i -DDEBUG

在这里插入图片描述条件编译有什么用呢?这里就要聊一聊大家对于一些软件会有不同的定位。如我们用的vs,大部分的学生群体一般用的是社区版,有些在职的开发人员通常会使用专业版。通常,社区版只给一些最基础的开发包和开发工具。而专业版会提供更丰富更新的开发包和开发工具。提供这两个不同版本的厂商会维护两份代码吗?答案是不需要,因为这需要维护专业版的代码就可以了,通过条件编译进行代码的裁剪已达到相应功能的阉割,使产品的具有差异化。

拓展补充

为什么我们能在windows或者Linux下进行对应的c/c++开发呢?这是因为我们在windows下面安装了vs20xx,亦或者是我们的linux云服务器出厂自带了gcc/g++编译器。这些是我们能在不同平台下进行对应c/c++开发的因素也是第一步。但是,这里要强调的是头文件以及库文件同样是非常重要的。库文件和头文件的安装是第二步。这是因为库文件和头文件可以大大提升我们的开发效率,提升代码的复用性以及可维护性。而我们大家在windows环境下下载集成开发工具vs2019或是vs2022选择安装对应的开发包,本质其实就是在在下载库文件和头文件。
下面简单介绍一下如何查看Linux下的头文件库文件。查看Linux的头文件库文件所在位置指令

ls /usr/include/

在这里插入图片描述
我们也可以用vim打开对应的头文件库文件查看相应的代码,并在底行模式中进行搜索。

vim string.h

在这里插入图片描述

gcc的编译过程

编译的过程是让我们写的高级编程语言的源代码经过编译器的处理变成汇编代码。汇编代码是由一系列符号指令组成的,每个指令都代表一条机器语言指令。下面简单带大家看看gcc是如何让我们的源代码转化成汇编的。

gcc -S test.c -o test.s

在这里插入图片描述
在这里插入图片描述
汇编语言是计算机底层的语言,它也是一门独立的学科。汇编语言是计算机硬件的直接控制语言,它与机器语言一一对应,一条汇编指令对应一条机器指令。像上图中的一些指令如call指令、movl指令等本质上都是在进行寻址操作或者是根据地址进行调用操作的。我们无需要深入学习,只要能大概做一个了解就可以了。

gcc的汇编过程

汇编的过程是编译器将汇编代码转化成机器能识别的二进制指令。下面简单用gcc演示一下汇编的操作。

gcc -c test.c -o test.o

``在这里插入图片描述

在这里插入图片描述
可以看到虽然给了.o文件可执行权限,但是它依旧不可以被执行。这是因为没有进行链接,不可以被执行。
在这里插入图片描述

gcc的链接过程

在程序翻译过程中的链接是指将编译器所产生的目标代码和库文件等合并成可执行文件的过程。链接过程也是程序翻译的最后一个阶段,完成链接之后,程序就可以被执行。下面依旧使用gcc进行简单的进行一个演示。

gcc test.o -o mytest

在这里插入图片描述
当然,直接使用gcc + 源文件也可以直接生成默认的可执行程序a.out。那么上述的那些选项记不住怎么办呢?这里介绍一个记忆技巧,我们看看键盘左上角有个ESC键,对应的就是预处理的-E选项,编译的-S选项以及汇编的-c选项。注意的是c是小写,其他两个选项是大写。生对应的文件分别是.i、.s、.o,可以记一下是国际标准组织ios。

库的介绍

上面在介绍编译器翻译程序的过程中介绍到在编译器链接的过程中会将头文件和库文件合并成可执行程序。什么是库文件呢?下面我就简单进行一个介绍。
我们在写c语言代码的时候难免要用printf输出、scanf输入。这两个库函数就是c标准库为我们提供的函数方法。当然了库的本质也是文件,在Linux中以.so(动态库)为后缀以及.a(静态库)为后缀都表示为库文件。在windows中,以.dll(动态库)为后缀以及以.lib(静态库)为后缀的文件我们称之为库文件。下面以Linux环境为例简单带大家看看库文件存放的位置以及命名规则

ls /lib64/libc.so*

在这里插入图片描述
方法是实现在库中的。库其实就是把不同的源文件(.c文件)进行一定的翻译,然后打包。这样就只需要提供一个库文件给用户使用即可,可以隐藏源文件的实现。库文件的出现给予我们站在巨人的肩膀上编程的机会,无需自己造轮子实现一些常用的库函数,当然我们在学习时,还是需要适度造轮子的。所以我们的写的可执行程序 = 库文件+头文件+我们写的源代码。

库的链接

库的链接分为两种:静态链接和动态链接。下面简单介绍一下这两种链接。
先介绍动态链接,动态链接需要动态库,而动态库就像是我们在以前上学时经常去的网吧。大家或多或少都因为家里不支持玩游戏,而偷偷跑去网吧开黑。这时候我们总能根据需求找到对应的网吧和小伙伴开黑。这就是我们的动态链接。有一天,网吧被查封了。我们大家伙就无法去上网了。这对应着动态库缺失后,许多依赖该动态库的程序无法正常运行。这是因为编译器在进行动态链接时,将方法的地址拷贝给我们的目标程序,一旦动态库缺失必定造成程序的错误。
在这里插入图片描述

我们在大学中或多或少都会配笔记本电脑。我们购买笔记本这一行为就类似于静态链接。而笔记本厂商就类似于静态库的角色。当我们已经买了笔记本电脑,但是厂商倒闭(静态库缺失),此时我们依旧可以正常使用我们的笔记本电脑。编译器进行静态链接时,会将对应的方法拷贝到我们的目标程序中,使得目标程序不再依赖静态库。
在这里插入图片描述

简单演示链接

下面简单演示一下动态链接。

gcc xxx.c -o xxx
ldd xxx

在这里插入图片描述
可以看到编译器默认是以动态链接进行链接的。如果我们想进行静态链接可以吗?答案是没问题。

gcc xxx.c -o xxx -static

在这里插入图片描述
file指令可以用于查看程序的链接方式

file 可执行程序

在这里插入图片描述

拓展补充

对于以下拓展内容仅仅只是介绍,相关验证等未来一一给大家提供。
1、如果没有静态库的话可以进行静态链接吗?答案是不行的。
2、若没有动态库,但有静态库并且gcc可以找到该静态库,可以进行动态链接吗? 答案是可以的。因为-static的本质是改变优先级。
3、日常中,我们使用的应用程序一定不是完全的静态链接或动态链接,是两者混合的。

动静态库的优缺

动态库的优点有资源利用率高(硬盘资源、内存资源、网络资源等),缺点为一旦库缺失,依赖库的各个程序都无法正常运行。
静态库的优点有各个应用程序不依赖于库,缺点为对于资源(硬盘资源、内存资源、网络资源等)的利用率低。

debug&&release

gcc默认编译生成的可执行程序是release版本,下面简单介绍一个指令来进行将gcc生成的可执行程序以debug版本发布。

gcc xxx.c -g

在这里插入图片描述
debug版本相比于release版本加了追踪调试信息所以体积更大。这是我们前面学习VS2019IDE时就已经介绍过了的,这里简单提一下。

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

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

相关文章

智见|比亚迪廉玉波:2023年销量目标300万辆

营收4240亿元,同比增长96%;归属上市公司股东净利润166亿元,同比增长445.86%;累计销售186.85万辆,同比增长152.5%……这是2022年比亚迪的成绩单。 据比亚迪披露,仅2022年一年新能源汽车的销量,就…

【重要】MThings V0.5.0更新要点

再见了BUG,为了改善质量,我们已修正了一些问题,以便您能继续富有成效且令人敬畏。 下载地址: http://gulink.cn/download 01. [新增]支持数据网关功能。 数据网关功能提供协议转换和数据汇聚功能,可实现不同的通道类型…

1--Gradle入门 - 简介、安装、目录结构、创建项目

1--Gradle入门 - 简介、安装、目录结构、创建项目 Gradle 官网 Gradle官网地址:Gradle Build Tool Gradle官方下载安装教程页面:https://gradle.org/install/ Gradle官方用户手册:https://docs.gradle.org/current/userguide/userguide.html …

4--Gradle入门 - 创建普通的web工程

4--Gradle入门 - 创建普通的web工程 前言 上一篇,我们已经创建了java工程,本篇章再来创建web工程。 “ 其实没啥用,还是研究如何部署 Springboot 环境就好了 ” 创建普通的web工程 1. 新建 gradle 管理的工程项目 1685862847224 2. 设置项目使…

前端构建工具的未来

本文作者系360奇舞团前端开发工程师 本文为翻译 原文标题:The Future Of Frontend Build Tools 原文作者:Alexander Joseph 原文链接:https://www.smashingmagazine.com/2022/06/future-frontend-build-tools/ 前端构建工具对现代前端开发者的…

基于SpringCloud+Vue房产销售平台的设计与实现

博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架下…

数据库从业者在行业的变革下------越来越难

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共…

有趣的数学 依靠想象力的微积分

1、无限分割计算圆的面积 考虑将圆切成若干等份,下图为4等份。 下图为8等份。 下图为16等份。 下图为最终想象出来的极限矩形,据此分割为无穷等份的圆拼接为一个矩形。 矩形的面积 r * C / 2。 r为半径,C为周长。 2、夹逼法计算圆周率 借助…

使用SwinTransformer进行图片分类

SwinTransformer 是微软亚洲研究院在2021年提出的适用于CV领域的一种基于Tranformer的backbone结构。 它是 Shift Window Transformer 的缩写,主要创新点如下。 1,分Window进行Transformer计算,将自注意力计算量从输入尺寸的平方量级降低为线…

力扣刷题记录(一)剑指Offer(第二版)

1、本栏用来记录社招找工作过程中的内容,包括基础知识学习以及面试问题的记录等,以便于后续个人回顾学习; 暂时只有2023年3月份,第一次社招找工作的过程; 2、个人经历: 研究生期间课题是SLAM在无人机上的应用,有接触SLAM、Linux、ROS、C/C++、DJI OSDK等; 3、参加工作后…

【JVM系列】jvm内存结构详解

文章目录 前言HotSpot VM介绍内存结构程序计数器JVM栈本地方法栈Java堆方法区运行时常量池 永久代和元空间永久代(PermGen)元空间(Metaspace) 直接内存总结 前言 我们为什么要学习JVM? 面试的需要中高级程序员的必备技…

java的字符流

字符流的底层也是字节流。字符流字节流字符集。 特点是输入流一次读一个字节,遇到中文时,一次读多个字节(读多少个与字符集有关);输出流底层会把数据按照指定的编码方式进行编码,变成字节再写到文件中。 字…

AI绘图高级篇 第7篇 MJ以图换图-卡通头像

大家好,我是菜鸟哥 这个是我们MJ系列的第7篇,以前在会员群里发过,就是把头像做成卡通或者3D的效果还是很酷,或者是迪斯尼风格的。其实非常简单,就是用了一个MJ的以图换图的功能,今天给大家详细的说一下。 前…

ChatGPT 指南:如何与人工智能模型进行对话与互动

人工智能技术的快速发展使得我们能够与智能机器进行对话和互动。 ChatGPT 是一种基于 GPT-3.5 架构的强大语言模型,它能够进行自然语言处理,理解我们的问题并提供相应的回答。本文将为您提供使用 ChatGPT 进行对话和互动的详细指南。 1、提出问题 与 Cha…

Python爬虫之基础知识

爬虫基础知识 一、爬虫的概念 模拟浏览器,发送请求,获取响应 网络爬虫(又被称为网页蜘蛛,网络机器人)就是模拟客户端(主要指浏览器)发送网络请求,接收请求响应,一种按照一定的规则,…

基于springboot+mybatis+mysql+html企业人事管理系统

基于springbootmybatismysqlhtml企业人事管理系统 一、系统介绍二、功能展示1.用户登陆2.员工奖惩--员工3.合同管理--员工4.个人薪酬--员工5.培训管理--员工6.个人绩效--员工7.员工管理(管理员)8.奖惩管理(管理员)9.薪酬管理&…

华为OD机试真题B卷 JavaScript 实现【公共子串计算】,附详细解题思路

一、题目描述 给定两个只包含小写字母的字符串,计算两个字符串的最大公共子串的长度。 注:子串的定义指一个字符串删掉其部分前缀和后缀(也可以不删)后形成的字符串。 二、输入描述 输入两个只包含小写字母的字符串。 三、输…

chatgpt赋能python:Python使用的排大小方式全解析:关于SEO的学习!

Python使用的排大小方式全解析:关于SEO的学习! 对于一个Python工程师来说,深度理解编程语言的基础知识总是非常重要的,包括了语法、函数、模块、数据结构以及算法等等。而在SEO领域,Python所采用的排大小方式&#xf…

jdk动态代理和cglb动态代理

目录 概述 JDK动态代理 cglb动态代理 概述 动态代理和静态代理都是代理模式的实现方式,其主要区别在于代理类生成的时机和方式。 静态代理是在编译时就确定了代理类的代码,在程序运行前就已经存在了代理类的class文件。代理类与委托类的关系在编译时就…

STM32F407移植1588v2(ptpd)

硬件: STM32F407ZGT6开发板 软件: VSCode arm-none-eabi-gcc openOCD st-link 在github搜到一个在NUCLEO-F429ZI开发板上移植ptpd的example,因为和F407差别很小,所以就打算用这个demo移植到手头的开发板上。因为目前只需要…