Linux:基础开发工具

文章目录

Linux 软件包管理器 yum

什么是软件包

在Linux下安装软件有三种方式:源代码安装、rpm安装、yum安装。

源代码安装就是下载程序的源代码,并进行编译,得到可执行程序。

但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包 (可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装。

软件包和软件包管理器, 就好比 "App" 和 "应用商店" 这样的关系。

yum(Yellow dog Updater, Modified)是Linux下非常常用的一种包管理器. 主要应用在Fedora, RedHat, Centos等发行版上。

关于rzsz

这个工具用于Windows机器和远端的Linux机器通过XShell传输文件。

安装完毕之后可以通过拖拽的方式将文件上传过去。

注意:关于yum的所有操作必须保证那个主机(虚拟机)网络畅通!

可以通过ping指令验证:

ping ww.baidu.com

查看软件包

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

yum list | grep lrzsz

结果如下:

注意:

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

安装软件

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

sudo yum install lrzsz

yum 会自动找到都有哪些软件包需要下载, 这时候敲 "y" 确认安装.

出现 "complete" 字样, 说明安装完成.

注意:

  1. 安装软件时由于需要向系统目录中写入内容, 一般需要 sudo 或者切到 root 账户下才能完成.
  2. yum安装软件只能一个装完了再装另一个. 正在yum安装一个软件的过程中, 如果再尝试用yum安装另外一个软件, yum会报错.

卸载软件

卸载命令

sudo yum remove lszrz

安装扩展源

尽管yum已经为我们准备了很多软件,但也有很多软件在yum上找不到,所以yum还有一个扩展源,是一些还没有进入yum的软件,但是以后可能会进入yum,但现阶段还不成熟。如果我们就是想要使用yum扩展源中的软件,就需要我们先下载yum扩展源,然后再按照之前的方法下载软件即可。

安装扩展源命令:

yum install -y epel-release

Linux 编辑器 vim

vim的基本概念

vim是一个多模式的编辑器,本文主要介绍最常用的三种模式:命令模式(Normal mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:

正常/普通/命令模式(Normal mode)

控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode

插入模式(Insert mode)

只有在Insert mode下,才可以做文字输入,按ESC键可回到命令行模式。该模式是我们后面用的最频繁的编辑模式。

底行模式(last line mode)

文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。 在命令模式下,: 即可进入该模 式。

添加行号:set nu

去除行号:set nonu

要查看你的所有模式:打开vim,底行模式直接输入:help vim-modes

三种模式的相互切换:

vim的基本操作

进入vim,在系统提示符号输入vim及文件名称后,就进入vim全屏幕编辑画面。不过有一点要特别注意,就是在进入vim之后,是处于[命令模式],要切换到[插入模式]才能够输入文字。

[命令模式]切换至[插入模式]

输入:a,i,o均可

[插入模式]切换至[命令模式]

目前处于[插入模式],就只能一直输入文字,如果发现输错了字,想用光标键往回移动,将该字删除,可以先按一下`ESC键转到[命令模式]再删除文字。当然,也可以直接删除。

[命令模式]切换至[底行模式]

shift + ;, 其实就是输入:

退出vim

在[底行模式]下:

w:保存当前文件

wq:保存并退出vim

q:不保存退出vim

q!/wq!:强制执行操作

vim命令模式

常用指令:

指令 含义
gg 定位光标到最开始行
G 定位光标到结尾行
n + G 光标定位到任意行
(n)+ yy 赋值光标所在行和其下(n - 1)行
(n) + p 粘贴n重复行到光标下一行
(n) + dd 剪切/删除
u 撤销
CTRL + r 反撤销
$ 定位光标到当前行结尾
^ 定位光标到当前行开始
w/b 光标按单词在行内/跨行移动
h/j/k/l 光标左下上右移动
shift + ~ 快速大小写切换
(n) + r 对光标及之后位置进行批量替换
(n) + x 对光标及之后位置的字符删除
R 批量替换模式(Esc退出)

底行模式

「/关键字」: 先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是想要的,可以一直按「n」会往后寻找到想要的关键字为止。

「?关键字」:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是想要的,可以一直按「n」会往前寻找到想要的关键字为止。

Linux 编译器 gcc/g++

两种编译器的用法几乎相同,区别在于:gcc只能编译C语言,g++可以编译C语言和C++。

以下介绍以gcc为例。

默认编译

使用gcc编译代码时,需要使用指令:

gcc test.c

这样会生成一个a.out文件,在当前目录下使用./a.out即可执行该程序。

因为gcc编译生成的文件默认文件名为a.out,编译后生成可执行文件,就可以使用相对路径执行该文件。

如果想为生成的文件命名,需要添加-o [文件]选项。

预编译

编译过程分为:预编译(进行宏替换)、编译(生成汇编代码)、汇编(生成二进制文件)、链接(生成可执行文件或库文件)四个过程。

预编译的作用:

  1. 展开头文件
  2. 条件编译
  3. 宏替换
  4. 去注释

所以经过预编译后的文件仍为C语言文件。

如果想得到预编译后的文件,可以使用-E选项。同时使用-o [文件]选项来命名生成的文件。

gcc -E test.c -o test.i

命名预编译后的文件没有硬性的规则,不过一般我们把经过预编译后的文件命名为.i文件。

编译

编译过程将C/C++文件转成汇编文件。

如果想得到编译后的文件,可以使用-S选项。同时使用-o [文件]选项来命名生成的文件。

gcc -S test.i -o test.s

我们一般将编译后的文件命名为.s文件。

需要注意的是,我们可以对test.i编译,也可以对test.c编译,前者是直接编译,后者是先预编译再编译,生成的汇编文件没有区别。

汇编

汇编过程将汇编代码转换为二进制代码。

gcc -c test.s -o test.o

汇编生成的文件称为可重定位目标二进制文件,简称目标文件,在Linux下后缀一般为.o,在Windows下后缀为.obj

目标文件还不能执行,要想生成一个可执行程序,还要进行最后一步:链接。

链接

目标文件和库进行链接形成可执行程序。

库(库文件):提供给我们方法的实现,如printf等。

C语言的标准库,本质就是一个文件,有自己的路径。

动态库和静态库

Linux下动态库后缀为.so,静态库后缀为.a,库的命名规则为libname.so.xxx,其中name是区分不同库文件的部分,其余部分相同。

Windows下动态库后缀为.dll,静态库后缀为.lib

链接分为动态链接和静态链接,动态链接用到的库称为动态库,静态链接用到的库称为静态库。

Linux下动态库的路径:/lib64/libc.so,静态库的路径:/lib64/libc.a

静态链接时,在程序运行的过程中会到动态库中查找所需方法,所以动态库不能缺失,缺失后不致影响一个程序,很多程序都无法正常运行;在编译器使用静态库进行静态链接时,将自己的方法拷贝到目标程序中,该程序以后不再依赖库。

在Linux中,编译形成的可执行程序,默认采用动态链接,如果要按照静态链接的方式进行编译,需要加-static选项。

如果没有静态库,使用-static会报错。

如果没有动态库,有静态库,而且编译器能找到,也可以编译。

-static的本质:改变优先级,且只适配一次,即一旦声明-static,就不会再使用动态库。

查看文件链接的库以及链接方式的指令:flie [文件]

动态链接和静态链接的对比

动态库时共享库,有效的节省资源(磁盘空间,内存空间,网络空间)。但动态库一旦缺失,各个程序都无法正常运行。

静态库不依赖库,程序可以独立运行,但程序体积大,比较消耗资源。

Linux 项目自动化构建工具 make/makefile

一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。

make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

例如当我们写出一个C语言文件test.c

C 复制代码
#include <stdio.h>

int main()
{
    printf("Hello Linux\n");
    return 0;
}

我们可以在同一目录下创建一个makefile文件,并在其中写

test:test.c
	gcc -o test test.c

.PHONY:clean
clean:
	rm -f test

其中第一行和第五行叫做依赖关系,第二行和第六行叫做依赖方法。

make是否执行:比较可执行程序的最近修改时间和源文件的最近修改时间,如果.exe新于.c,则不执行make,如果.exe老于.c,则执行make。

.PHONY:[文件]可以使该文件忽略时间,总是被执行。

使用make时,后面要加指令,如:make clean,如果不加指令,默认执行makefile中的第一条指令。

Linux 调试工具 gdb

debug和release

在Linux下,编译生成的可执行程序默认是release版本,无debug信息,想要生成debug版本的可执行程序,需要在编译时加-g选项。

readelf:可以读取可执行程序文件的指令。

readelf -S [文件] | grep -i debug

可以查看文件中有没有debug信息。

gdb指令

指令 含义
l [行号/函数名] 查看代码
r 启动程序(到断点停下)
b [行号/函数名] 打断点
info b 查看断点
d [断点编号] 取消断点
n 逐过程调试
s 逐语句调试
p [变量] 查看变量值
display [编号] 常显示变量值
undisplay 取消常显示
until [行号] 跳转至x行
finish 直接结束当前函数
c 运行到下一个断点
disable [编号] 关闭断点
enable [编号] 打开断点
相关推荐
一只学习python的兔子30 分钟前
Linux的目录结构、Linux命令入门-命令基础 加油!
linux·运维·服务器·开发语言·python·eclipse·tomcat
灿烈♡35 分钟前
生产消费者(CP)模型
linux·c++
zch不会敲代码35 分钟前
Linux进程--进程状态
linux·运维·服务器·开发语言·后端·学习
openArch1 小时前
什么是开源什么是闭源?以及它们之间的关系
linux·开源·闭源
麻辣香蝈蝈1 小时前
系列文章介绍
java·linux·ide·vim·intellij-idea
YCyjs1 小时前
web基础与HTTP协议
linux·运维·服务器·网络·网络协议·http·云计算
变成我1 小时前
LVS-DR模式集群:案例与概念
linux·运维·服务器·网络·ip
ssg183365439742 小时前
LVS-DR集群的部署
linux·服务器·lvs
与苟富贵2 小时前
部署LVS-DR群集
linux·服务器·lvs
大叔学Linux2 小时前
Linux学习第57天:Linux PWM驱动实验
linux·驱动开发·嵌入式硬件·学习