重生之小比特头像
关注
【Linux系统】04 Linux开发工具(上)封面图

【Linux系统】04 Linux开发工具(上)

1 yum 软件包管理器

1.1 软件包与包管理器概念

在 Linux 中安装软件有两种主流方式:

  1. 源码编译安装:下载完整源代码,本地机器编译生成可执行程序。 缺点:需要手动处理编译环境、库依赖,步骤繁琐,新手不推荐。
  2. 预编译软件包安装:开发者提前把源代码编译完成,打包成软件包,存放在网络软件服务器上。

类比理解: 软件包 ≈ Windows 的 exe 安装包 / 手机 APP 安装包 包管理器 ≈ 手机上的应用商店,负责查找、下载、安装、卸载软件,自动处理依赖。

不同发行版包管理器不一样:

  • CentOS / RedHat / Fedora:yum,软件包后缀.rpm
  • Ubuntu / Debian:apt,软件包后缀.deb

1.2 软件依赖关系

Linux 软件大多不是完全独立。一个软件运行,需要依赖其他库文件。

举例:安装 A 软件,A 运行需要 B 库;B 库又依赖 C 库,这就是依赖链条。

如果手动安装,需要人工一层层去找所有依赖包,非常麻烦。 yum/apt 核心价值:自动分析依赖关系,一次性把所有需要的软件全部下载安装完成。

1.3 国内镜像源

官方软件仓库服务器部署在国外,国内服务器直接访问下载速度很慢。 国内高校、阿里云等机构,完整拷贝国外软件包,搭建国内镜像服务器。 修改系统源配置指向国内镜像,可以大幅提升下载速度。

常用国内镜像站点:

1.阿里云镜像站 

https://developer.aliyun.com/mirror/
阿⾥云提供了丰富的Linux发⾏版镜像,包括CentOS、Ubuntu、Debian等,⽤⼾可
以通过该镜像站快速下载和更新软件包。
2. 清华⼤学开源软件镜像站
官⽅链接:https://mirrors.tuna.tsinghua.edu.cn/
清华⼤学镜像站提供了多种Linux发⾏版的镜像,以及Python、Perl、Ruby等编程语
⾔的扩展包。该镜像站还提供了丰富的⽂档和教程,帮助⽤⼾更好地使⽤这些软件
包。
3. 中国科学技术⼤学开源镜像站
官⽅链接:http://mirrors.ustc.edu.cn/
中科⼤镜像站提供了多种Linux发⾏版的镜像,以及常⽤的编程语⾔和开发⼯具。⽤⼾
可以通过该镜像站⽅便地获取所需的软件包和⼯具。

提示:云服务器出厂一般已经配置国内镜像源;本地虚拟机学习环境经常需要手动替换镜像源。

1.4 CentOS yum 常用命令实操

重要提醒:安装卸载软件会修改系统目录,绝大多数 yum 命令需要加sudo提升权限。 使用 yum 前先确认网络正常:ping www.baidu.com。 yum 同一时刻只能执行一个任务,不要打开多个终端同时执行 yum,会出现锁冲突报错。

① 查找软件包 yum list + grep

yum list 会输出海量软件包,配合管道grep过滤我们关心的包。

# 查询 lrzsz 软件包
yum list | grep lrzsz

输出样例解读: lrzsz.x86_64 0.12.20-36.el7 @base

  1. lrzsz.x86_64:软件包名称;x86_64代表 64 位系统;el7代表适配 CentOS7
  2. 第二列:软件版本号
  3. @base:该软件来自 base 基础软件源
② 安装软件
sudo yum install -y lrzsz

-y参数:全部交互确认选 yes,不需要手动输入 y。

③ 卸载软件
sudo yum remove -y lrzsz

1.5 Ubuntu apt 简单了解

如果使用 Ubuntu 系统,包管理器为 apt,命令有差异:

#搜索软件
apt search lrzsz
#安装软件
sudo apt install -y lrzsz
#卸载软件
sudo apt remove -y lrzsz

1.6 yum 源配置文件、epel 扩展源

yum 源配置文件存放路径:

ll /etc/yum.repos.d/

目录下以.repo结尾的文件,就是各个软件源配置文件。

epel 扩展源

系统自带 base 源内置软件数量有限,epel 源提供大量额外开源工具。 安装 epel 扩展源:

sudo yum install -y epel-release

安装之后就可以使用 epel 仓库里面的软件包。

离线环境无法使用 yum,入门学习阶段不需要重点关注。


2 Vim 编辑器

2.1 vi 与 vim 区别

  • vi:古老原始的文本编辑器。
  • vim:vi 的增强升级版本,完全兼容 vi 的所有指令;新增语法高亮、可视化操作等大量实用功能。

学习统一使用 vim。

打开文件语法:

vim test.c

⚠新手大坑:vim 打开文件,默认是命令模式,不能直接打字输入内容,需要切换到插入模式才可以编辑。

2.2 vim 三大核心模式

vim 内部一共有十多种模式,入门只掌握最重要 3 种:

  1. 正常 / 命令模式(Normal):vim 打开文件默认进入该模式。不能输入文字;用来移动光标、删除、复制粘贴、撤销。
  2. 插入模式(Insert):真正输入、编辑代码文字的模式。
  3. 底行模式(Last line):执行保存、退出、文本查找、设置参数,shift + :进入。

2.3 模式之间互相切换

  1. 命令模式 → 插入模式:i / a / o
  2. 插入模式 → 命令模式:按 Esc
  3. 命令模式 → 底行模式:shift + ; 输入冒号:
  4. 底行模式回到命令模式:按Esc

🆘新手万能救命按键:分不清当前是什么模式,多按几次Esc,强制回到命令模式。

表格

按键(命令模式下执行)作用
i在当前光标位置开始输入
a光标向后挪一格,下一个字符位置输入
o在当前行下方新开一行,行首输入

2.4 正常(命令)模式全套操作

光标移动

传统 vim 推荐不用方向键,使用 hjkl 移动光标

  • h 左、j 下、k 上、l 右

表格

命令功能说明
gg跳到整个文档第一行
G跳到整个文档最后一行
^跳到当前行行首(非空格位置)
$跳到当前行行尾
w跳到下一个单词开头
b跳到上一个单词开头
ctrl + f向下翻一整页
ctrl + b向上翻一整页
15G直接跳转到第 15 行
删除文本

表格

命令功能说明
x删除光标所在位置 1 个字符
6x从光标开始向后删除 6 个字符
X删除光标前面一个字符
dd删除光标所在完整一行
5dd从当前行向下一共删除 5 行
复制与粘贴

表格

命令功能说明
yy复制光标当前一整行
4yy复制从当前行往下 4 行
yw复制一个单词
p粘贴内容到光标行的下方
替换、撤销恢复

表格

命令功能说明
r替换光标处单个字符;按 r 再输入目标字符
R持续覆盖替换,按 Esc 结束替换模式
u撤销上一步操作,可以多次 u 做多步撤销
ctrl + r反撤销,恢复被撤销的操作

2.5 底行模式常用指令

先按Esc回到命令模式,输入shift + :进入底行模式。

表格

底行指令功能
w保存文件,不退出
q退出;文件有改动无法直接 q 退出
wq保存并且退出 vim
q!强制不保存退出,丢弃全部修改
set nu显示行号
set nonu关闭行号显示
/hello向下搜索字符串 hello,n 跳转下一个匹配
?hello向上搜索字符串 hello,n 跳转上一个匹配
12输入数字回车,跳转到 12 行

新手高频报错:修改完文件输入q无法退出。解决:要么:wq保存退出,要么:q!放弃修改强制退出。

2.6 vim 简单本地配置

vim 配置分两套:

  1. 全局配置:/etc/vimrc,对系统全部用户生效,需要 root 权限。
  2. 用户私有配置:家目录下隐藏文件 .vimrc,普通用户即可修改,只作用于当前登录账号。
#回到家目录
cd ~
#打开私有配置文件
vim .vimrc

写入简单配置示例:

syntax on        "开启语法高亮
set nu           "默认显示行号
set shiftwidth=4 "tab缩进占4个空格

保存退出,重新打开 vim 配置即可生效。

系统自带练习教程,终端输入:vimtutor,跟着练习 vim 操作。插件 TagList、WinManager 入门了解即可。


3 gcc /g++ C/C++ 编译器

3.1 gcc 与 g++ 区别

  • gcc:主要编译 C 语言代码;也可以编译 C++,但是不会自动链接 C++ 标准库。
  • g++:专门编译 C++ 代码,内部会调用 gcc,并且自动链接 C++ 标准库。

写.cC 代码用 gcc;写.cppC++ 代码优先使用 g++。

示例简单代码 test.c

#include <stdio.h>
int main()
{
    printf("hello gcc\n");
    return 0;
}

最简编译运行:

gcc test.c -o test
./test

3.2 C/C++ 程序完整 4 个编译阶段

完整编译流程分为四步,每一步生成对应中间文件:

  1. 预处理(Preprocessing):展开头文件、替换宏定义、删除注释、处理条件编译。输出后缀.i文件。
  2. 编译(Compilation):语法语义检查,把 C/C++ 代码翻译成汇编代码,输出后缀.s汇编文件。
  3. 汇编(Assembly):汇编代码转为机器指令,生成可重定位目标文件,后缀.o。
  4. 链接(Link):把多个.o目标文件、系统库文件合并,生成最终可执行程序。

平时直接gcc test.c -o test,gcc 会一次性走完四步,中间文件不会保留。

3.3 分步编译实操

  1. 预处理 -E,只做预处理,输出.i
gcc -E test.c -o test.i
  1. 编译 -S,生成汇编.s
gcc -S test.i -o test.s
  1. 汇编 -c,生成目标文件.o
gcc -c test.s -o test.o
  1. 链接,生成可执行程序
gcc test.o -o test

3.4 静态链接 vs 动态链接

静态链接

链接阶段,把库里面的代码完整拷贝复制到我们的可执行程序内部。

  • 优点:程序运行时不再依赖外部库文件,移植方便;运行速度快。
  • 缺点:可执行文件体积大;多个程序使用同一个库,内存会有多份副本;库升级需要重新编译整个程序。
  • 静态库后缀:.a

动态链接(gcc 默认方式)

链接阶段不会把库代码拷贝进程序。仅仅记录依赖信息;程序运行的时候才加载外部动态库。

  • 优点:可执行文件体积小;内存多个程序可以共享同一份库;库升级替换动态库文件即可,程序不需要重新编译。
  • 缺点:运行环境必须存在对应动态库,否则程序直接无法运行。
  • 动态库后缀:.so

ldd 命令:查看程序依赖哪些动态库

ldd test

输出会列出该可执行程序依赖的所有.so动态库。

补充:CentOS 默认没有安装静态库,如果需要使用静态库,执行:

sudo yum install glibc-static libstdc++-static -y

编译使用-static参数开启静态链接:

gcc test.c -o test_static -static

3.5 gcc 高频编译选项汇总

表格

选项作用
-E只执行预处理,停止编译
-S预处理 + 编译,生成汇编,停止汇编阶段
-c预处理 + 编译 + 汇编,生成.o 目标文件,不链接
-o filename指定输出文件名
-g加入调试信息,给 gdb 调试器使用
-static使用静态链接
-O0 / -O1 / -O2 / -O3编译器优化等级,O0 无优化,O3 最高优化
-Wall打开全部警告提示,开发推荐加上
-w关闭所有警告(不推荐)

示例带警告、调试信息编译:

gcc -g -Wall test.c -o test

4 本篇小结

  1. yum 是 CentOS 包管理器,自动处理软件依赖;epel 扩展源增加软件数量,操作需要 sudo。
  2. vim 三大模式:命令模式、插入模式、底行模式;Esc 回到命令模式,i/a/o进入编辑,shift+:进入底行模式保存退出。
  3. gcc 编译 C,g++ 编译 C++;程序完整 4 阶段:预处理→编译→汇编→链接。
  4. 静态链接把库代码拷贝进程序;动态链接运行时加载库,gcc 默认动态链接;ldd查看动态库依赖。

5 面试 & 实操高频问题

Q1 gcc 和 g++ 区别?

gcc 主要编译 C 语言;g++ 编译 C++,会自动链接 C++ 标准库。gcc 也可以编译 cpp,但不会自动链接 C++ 库。

Q2 C 程序编译四个阶段分别做什么?生成什么后缀文件?

预处理(.i):去注释、宏替换、头文件展开;编译(.s)生成汇编;汇编(.o)机器目标文件;链接合并目标与库生成可执行程序。

Q3 静态链接与动态链接区别?

静态链接:编译时库代码拷贝进可执行文件,运行不依赖外部库,体积大,库更新需要重编译;静态库.a。 动态链接:编译只记录依赖,运行时加载.so库,体积小,运行环境必须有库文件。

Q4 ldd 命令作用?

查看可执行程序依赖哪些动态共享库。

Q5 vim 打开文件打不出字?

默认是命令模式,i/a/o 切换插入模式才能输入。

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/wuqingyigexiaoba/article/details/167131771

文章来源转载

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--