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 编号 打开断点
相关推荐
摇滚侠11 小时前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush411 小时前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行52011 小时前
Linux 11 动态监控指令top
linux
不会C语言的男孩13 小时前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言
古城小栈13 小时前
Unix 与 Linux 异同小叙
linux·服务器·unix
凡人叶枫14 小时前
Effective C++ 条款42:了解 typename 的双重意义
java·linux·服务器·c++
2601_9618752414 小时前
决战申论100题2026|最新|范文
linux·容器·centos·debian·ssh·fabric·vagrant
java_cj14 小时前
深入kube-apiserver认证机制:从Bearer Token到mTLS的完整认证链解析
linux·运维·服务器·云原生·容器·kubernetes
lsyeei15 小时前
linux 系统目录详解
linux·运维·服务器
森G15 小时前
75、服务器源码解析---------云视频服务项目
linux·服务器·网络·c++·qt