Linux基础环境开发工具的使用(yum,vim,gcc,g++)(下)

简介: Linux基础环境开发工具的使用(yum,vim,gcc,g++)
3.批量化注释/去注释操作

1.批量化注释

我们先移动到这里,进行后续操作

我们先ctrl+v

然后按下j,选好要注释的区域

然后shift+i

然后//

最后Esc

2.批量化去注释

先ctrl+v ,然后j选好区域

然后d,成功删除注释

3.使用vim来修改sudoers file文件

前面写的这篇博客:Linux中的shell外壳与权限(包含目录文件的权限,粘滞位的来龙去脉)中提到过:

下面我们开始介绍如何把某个用户的用户名添加进sudoers这个配置文件中

首先先切换到root用户,然后进入/etc目录下

找到sudoers文件

然后我们ll sudoers文件,发现root用户对于这个文件只有r权限

但是我们之前不是提到过root不受权限约束吗?

但是有些情况下,root也是会受到权限约束的

比如对于sudoers文件的修改

我们vim sudoers

找到这里

这里的

Allow root to run any commands anywhere

就是指root可以在任何地方中执行任何命令

这个就是sudoers配置文件中我们需要添加用户的地方

我们系统中有一个zs用户,我现在想要将zs添加到这个sudoers文件中

我们在命令模式下对root那一行执行yy复制命令

然后到下面那几行中进行p粘贴命令

然后我们进入插入模式将这一行的root用户名改为zs

然后切换为底行模式,输入wq

然后我们发现root用户无法进行保存并退出,也就是说在这个sudoers 文件中root的权限是会受到限制的

那怎么办呢?

再次从命令模式回到底行模式

直接wq!

回车退出

成功退出

下面我们切换到zs用户来演示一下

我们先让root回到root的家目录下

然后切换为zs

使用zs执行sudo ls命令

输入zs的密码之后,发现成功执行

然后因为我后续不想让zs处于sudoers文件中

所以我去切换回root用户,

继续修改sudoer文件,删除zs的权限

然后继续切换到zs,让zs执行sudo ls命令

此时zs无法执行sudo命令,因为zs不在sudoers file这个配置文件中

4.vim非正常退出的解决方法

当我们误操作退出了vim之后

比方说这个样子

在右边的那个窗口当中我刚刚写完了printf(“hello”)还没来得及写;就因为某种意外直接退出了

比方说我在还没有保存的情况下直接关掉右边这个窗口

我输入:确定

然后就只剩下我左边这个窗口了

然后我vim test.c

出现了这个样子

这是为什么呢?

是因为当我们在vim中异常退出时,vim会自动给我们上一次的编辑结果进行保存

保存到这个.test.c.swp文件中

然后我们只需要这样做就行:

1.先按R/shift+r

进入到上次异常关闭后的文件

然后wq退出这个文件

2.然后再vim test.c进入

会发现还是这个样子,然后输入D/shift+d

进入到这个文件中,然后继续wq退出

然后再vim test.c,

发现这个文件就恢复正常了

其中,这个R:就是让我们能够恢复上次异常退出时所编辑出的结果(通过第一次wq来恢复)

D:就是删除这个vim因为我们异常退出所形成的临时文件(.test.c.swp)

三.gcc/g++

在VS中,程序的这4步翻译过程我们一个ctrl+F5就可以完成

体会不到具体的过程

而在Linux中我们是可以体会到具体的程序翻译的过程的

下面我们来在Linux下面看一下具体的程序翻译的过程

我们先新建一个目录gccdir,在这个目录下创建一个code.c文件

然后写入这样的内容

1.预处理

gcc -E code.c -o code.i
-E:告诉gcc,编译过程中预处理做完之后就停下来
code.c 要编译的C语言代码
-o code.i:将code.c预处理后的文件名重命名为 code.i
• 1
• 2
• 3
• 4
• 5
• 6
• 7

然后我们用vim 查看code.c和code.i

看一下它们之间的差异

我们在code.i中shift+g 定位到最后一行

发现code.i中上方那一大堆代码其实就是头文件stdio.h中的代码

(也就是说:所谓头文件展开,本质就是在预处理的时候,将头文件的内容拷贝至源文件中)

而且宏定义的M也已经被替换为10了

并且注释也已经删除了

还有条件编译呢,

下面我们再来介绍一下条件编译

我之前在一篇博客中C语言预处理及宏和函数的区别与各自优劣点的详解写到过条件编译

这是条件编译的一大用途:防止头文件被重复引用

2.条件编译的补充内容

我们再创建一个ifdef_test.c文件

这个代码的含义是

如果定义了VERSION1

那么就执行第一个printf语句

如果在没有定义VERSION1的情况下定义了VERSION2

那么就执行第二个printf语句

如果VERSION1和VERSION2都没有定义

那么就执行第三个printf语句

然后我们正常gcc 编译ifdef_test.c文件

这里的./a.out就是执行a.out这个可执行程序,我们下面会介绍的

这种正常编译的情况我们很容易理解

也就是说:

我们可以通过给编译器传递不同的宏值,来进行对代码的动态裁剪

gcc ifdef_test.c -o mycmd -D VERSION1=1
这里的-o mycmd 就是把生成的可执行文件重命名为mycmd
这个-D 就是我们要介绍的补充内容
这个-D经常跟条件编译结合使用
通常
我们会在这个-D 后面定义宏,
让我们能够做到在编译时选择性地去编译不同的代码

下面我们来看一下这个代码的运行结果

可见这个VERSION宏被成功定义了

同理,我们也可以宏定义VERSION2

那么这个究竟有什么用呢?

3.编译

命令:

gcc -S code.i -o code.s  :这是将上面形成的code.i文件编译为code.s文件
gcc -S code.c -o code.s  :这是直接将code.c文件编译为code.s文件
也就是说gcc跟上-S等等选项是可以跳步的

下面我们来演示一下

然后我们vim code.s,查看一下这个文件

这个就是code.s,也就是code.c/code.i的汇编代码

其中mov push call pop ret都是汇编指令

注意:汇编代码在不同的编译器下的样子是不同的

下面给大家看一下同样的代码在VS2013中的样子

4.汇编

gcc -c code.s -o code.o
或者
gcc -c code.i -o code.o
或者
gcc -c code.c -o code.o

下面我们来演示一下

然后我们vim code.o进入code.o

然后我们发现出现了一堆乱码,这是为什么呢?

你不是说汇编阶段是将汇编代码翻译成二进制指令吗?

那为什么给我出现一堆乱码呢?

首先:

code.o文件的确是二进制文件

其次:

vim是一款文本编辑器,只能识别文本文件,无法识别二进制文件

就像是Windows中的记事本,Windows中的记事本是无法识别二进制文件的

给大家演示一下:

就拿我们刚才在VS2013中运行的那个代码的.obj目标文件为例:

我们用记事本打开这个.obj目标文件

也是一堆乱码

5.链接

首先我先把已经存在的那个mycmd删除,以防大家误会

其实我也可以不删除,直接让我新生成的这个mycmd去替代曾经的那个mycmd

命令:

gcc code.o -o mycmd
可执行文件名称(这个名称自己可以随便取,这里我取名为mycmd(my command:我的命令))

6.gcc的总结

那以后都要这么麻烦吗?

其实以后我们直接这样就行,也就是直接把预处理,编译,汇编和链接放到一起执行

gcc code.c -o 可执行文件名称

我先把code.i,code.s,code.o,mycmd,mycmd1都删除

6.gcc和g++的区别与联系

下面我们来演示一下

左边是test.c

右边是test.cpp

然后我们先用gcc来分别编译这两个文件

test.c 编译为 mycmd_c

test.cpp 编译为 mycmd_cpp

用gcc编译test.c成功,用gcc编译test.cpp失败

下面先把mycmd_c删除

然后我们用g++来编译test.c和test.cpp

用g++编译test.c和test.cpp均成功

以上就是Linux基础环境开发工具的使用(yum,vim,gcc,g++)的全部内容,希望对大家有所帮助!!

相关文章
|
10月前
|
NoSQL Linux 开发工具
Linux环境基础开发工具的使用(yum、vim、gcc、g++、gdb、make/Makefile)
本文介绍了yum 包管理工具、Vim 编辑器、gcc/g++ 编译器、gdb 调试器、编译原理及 Makefile 的使用,同时还配备了如何使用,以及图解。旨在帮助读者更好地理解和应用这些工具与技术。
484 0
|
缓存 Ubuntu Linux
Linux中yum、rpm、apt-get、wget的区别,yum、rpm、apt-get常用命令,CentOS、Ubuntu中安装wget
通过本文,我们详细了解了 `yum`、`rpm`、`apt-get`和 `wget`的区别、常用命令以及在CentOS和Ubuntu中安装 `wget`的方法。`yum`和 `apt-get`是高层次的包管理器,分别用于RPM系和Debian系发行版,能够自动解决依赖问题;而 `rpm`是低层次的包管理工具,适合处理单个包;`wget`则是一个功能强大的下载工具,适用于各种下载任务。在实际使用中,根据系统类型和任务需求选择合适的工具,可以大大提高工作效率和系统管理的便利性。
1581 25
|
Linux 开发工具 数据安全/隐私保护
linux异常一:feng 不在 sudoers 文件中,此事将被报告。yum提示Another app is currently holding the yum lock; waiting for
这篇文章介绍了在CentOS 7系统中安装Docker时遇到的两个常见问题及其解决方法:用户不在sudoers文件中导致权限不足,以及yum被锁定的问题。
338 2
linux异常一:feng 不在 sudoers 文件中,此事将被报告。yum提示Another app is currently holding the yum lock; waiting for
|
Linux 编译器 C语言
【Linux快速入门(一)】Linux与ROS学习之编译基础(gcc编译)
【Linux快速入门(一)】Linux与ROS学习之编译基础(gcc编译)
425 2
|
存储 缓存 Linux
【Linux】另一种基于rpm安装yum的方式
通过本文的方法,您可以在离线环境中使用RPM包安装YUM并进行必要的配置。这种方法适用于无法直接访问互联网的服务器或需要严格控制软件源的环境。通过配置本地YUM仓库,确保了软件包的安装和更新可以顺利进行。希望本文能够为您在特定环境中部署YUM提供实用的指导。
2013 0
|
7月前
|
安全 关系型数据库 MySQL
CentOS 7 yum 安装 MySQL教程
在CentOS 7上安装MySQL 8,其实流程很清晰。首先通过官方Yum仓库来安装服务,然后启动并设为开机自启。最重要的环节是首次安全设置:需要先从日志里找到临时密码来登录,再修改成你自己的密码,并为远程连接创建用户和授权。最后,也别忘了在服务器防火墙上放行3306端口,这样远程才能连上。
1717 16
|
6月前
|
存储 关系型数据库 MySQL
MySQL介绍和MySQL包安装 -- RHEL系列(Yum资源库安装MySQL)
MySQL是一款开源关系型数据库,高性能、易用、跨平台,支持多种存储引擎,广泛应用于Web开发、企业级应用等领域。本教程介绍其特点、架构及在主流Linux系统中的安装配置方法。
1133 0
MySQL介绍和MySQL包安装 -- RHEL系列(Yum资源库安装MySQL)
|
10月前
|
缓存 Ubuntu 前端开发
yum的安装和使用(包含安装过程中遇到的问题及解决方法)
yum的安装和使用(包含安装过程中遇到的问题及解决方法)
1473 1
yum的安装和使用(包含安装过程中遇到的问题及解决方法)
|
监控 Linux
yum install -y net-snmp-devel 安装不成功 zabbix项目安装,Errors during downloading metadata for repository ‘extras-common’:问题解决方案-优雅草卓伊凡
yum install -y net-snmp-devel 安装不成功 zabbix项目安装,Errors during downloading metadata for repository ‘extras-common’:问题解决方案-优雅草卓伊凡
672 13
yum install -y net-snmp-devel 安装不成功 zabbix项目安装,Errors during downloading metadata for repository ‘extras-common’:问题解决方案-优雅草卓伊凡
|
关系型数据库 MySQL Linux
Linux 安装 mysql【使用yum源进行安装】
这篇文章介绍了在Linux系统中使用yum源安装MySQL数据库的步骤,包括配置yum源、安装MySQL服务、启动服务以及修改root用户的默认密码。
Linux 安装 mysql【使用yum源进行安装】