
在Windows上我们习惯了“下一步”式的软件安装习惯了IDE集成开发环境一键编译运行。但到了Linux下一切都变得“原始”起来——没有图形界面、没有鼠标点击一切都要靠命令行完成。一、软件包管理器 —— Linux的“应用商店”1.1 什么是软件包管理器想象一下如果没有应用商店你怎么安装微信你得去官网下载安装包双击运行一路“下一步”。那如果软件是开源的没有提供安装包呢你就得下载源代码自己编译——这个过程可能涉及到几十个依赖库光是解决依赖关系就能让人崩溃。软件包管理器就是为了解决这个问题而生的。类比说明软件包≈ Windows上的安装程序.exe/.msi软件包管理器≈ 应用商店App Store软件源≈ 应用商店的服务器主流包管理器CentOS/RHEL/Fedora使用yumYellow dog Updater, ModifiedUbuntu/Debian使用aptAdvanced Package Tool1.2 核心操作对比操作CentOS (yum)Ubuntu (apt)搜索软件包yum list | grep 包名apt search 包名查看包信息yum info 包名apt show 包名安装软件sudo yum install -y 包名sudo apt install -y 包名卸载软件sudo yum remove 包名sudo apt remove 包名更新软件源yum makecacheapt update升级所有包yum updateapt upgrade重要提示所有yum/apt操作必须保证网络畅通可以用ping www.baidu.com验证。1.3 软件源的配置软件源本质上是一个配置文件告诉包管理器去哪里下载软件包。CentOS源路径/etc/yum.repos.d/CentOS-Base.repo # 标准源 /etc/yum.repos.d/epel.repo # 扩展源Ubuntu源路径/etc/apt/sources.list # 标准源 /etc/apt/sources.list.d/ # 扩展源目录二、Linux软件生态先从吃饭说起想象你饿了想吃饭。有几种方式方式操作类比Linux自己种菜、自己做饭从种子开始种菜、收割、烹饪源码编译安装去菜市场买菜回来做买半成品食材回家简单加工包管理器安装apt/yum叫外卖点一下有人送上门应用商店/Snap/Flatpak去朋友家蹭饭朋友做什么你吃什么系统自带软件在Linux的世界里这四种方式并存各有各的适用场景。Linux的物种多样性不同发行版 不同方言地区Linux不是一个东西而是一个大家族Linux │ ┌─────────────┼─────────────┐ │ │ │ RedHat Debian Arch │ │ │ ┌───┴───┐ ┌───┴───┐ │ │ │ │ │ │ CentOS Fedora Ubuntu Mint Manjaro用方言来理解Linux发行版类比特点Ubuntu普通话最流行文档最多新手首选CentOS/RHEL官方公文用语稳定、保守、服务器专用Arch粤语新潮、灵活、高手专用Debian文言文极稳定、极保守、社区驱动关键点你在Ubuntu上学到的方言apt命令到了CentOS上就听不懂了要用yum命令——就像你在中国说普通话能交流到了广东可能就听不懂粤语了。软件安装的四层世界第一层官方仓库 —— 官方食堂┌─────────────────────────────────────────┐ │ 官方仓库软件源 │ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │ │ │gcc │ │vim │ │git │ │nginx │ │ │ └──────┘ └──────┘ └──────┘ └──────┘ │ │ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │ │ │mysql │ │python│ │node │ │......│ │ │ └──────┘ └──────┘ └──────┘ └──────┘ │ └─────────────────────────────────────────┘ │ ▼ 一条命令搞定 yum install nginx # 像食堂打饭一样简单特点官方认证安全可靠自动解决依赖问题你点一个菜食堂帮你配好所有佐料一条命令安装、卸载、更新软件版本偏旧为了稳定不求最新类比学校食堂——安全、便宜、省事但菜品固定不会天天换新花样。第二层第三方仓库 —— 美食街官方仓库的软件不够新不够多那就去第三方仓库找找# CentOS 的扩展源 EPEL yum install epel-release # 先安装美食街入口 yum install 某软件 # 然后就能装了┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ 官方仓库 │ │ EPEL/PPA │ │ 社区仓库 │ │ 食堂 │ │ 美食街 │ │ 私房菜 │ └──────────────┘ └──────────────┘ └──────────────┘ 基础软件 扩展软件 小众软件常见第三方源名称适用发行版说明EPELCentOS/RHEL企业版Linux额外包——官方出的扩展源PPAUbuntu个人软件包存档——开发者直接提供类比官方食堂旁边开了条美食街——各种风味都有但可能比食堂贵一点、没那么标准。第三层源码编译 —— 自己做饭没有官方包也没有第三方包或者你想要最新版本、定制功能那就自己编译# 三步走 ./configure # 看看你家有什么厨具检测环境 make # 烹饪编译 make install # 上桌安装到系统什么时候自己做饭官方源的版本太旧你需要新功能软件官方没有提供包只提供了源码你需要修改代码或者定制编译选项代价依赖要自己解决跟买菜一样要自己配齐所有食材卸载要手动删吃完饭要自己洗碗更新要重新编译每次都要重新做一遍类比自己买菜、自己做饭——自由度高但花时间、费精力。第四层容器化/跨平台包 —— 外卖平台近几年流行起来的新物种格式说明类比SnapUbuntu主推沙箱隔离自动更新饿了么——标准化配送FlatpakRedHat主推专注桌面应用美团——百花齐放AppImage下载即运行无需安装带便当——打开就能吃Docker把整个厨房打包带走移动厨房——去哪都能做饭它们解决了什么问题这个软件我在Ubuntu上能跑怎么到CentOS上就装不上了这些格式把软件本身 它需要的环境一起打包让你在任何Linux发行版上都能运行。包管理器就像一个智能采购员——你说我要做红烧肉它自动去菜市场买肉、买酱油、买糖、买葱姜蒜然后一起给你送过来。没有包管理器你就得自己去买每一样东西还可能买回来发现缺了某样。谁在免费提供这些软件角色谁在干图什么写代码的全球数百万开发者兴趣、学习、简历、信仰打包的发行版维护者RedHat员工、Debian志愿者工资公司派的任务/ 社区贡献搭镜像站的清华、阿里、中科大学校教育使命 / 企业布局云生态最后为什么这套生态能运转Linux开源生态是一个正循环我用开源软件→ 不用花钱买许可证省下的钱买云服务器→ 基础设施更强了用服务器部署服务赚钱→ 真的挣到钱了赚到钱回馈开源社区→ 捐款、写代码、搭镜像站社区变更好→ 更多人用 → 回到第1步三、Vim编辑器Vim是一个文本编辑器就像Windows里的记事本Notepad但强大一百倍。你可以用它写代码、写配置文件、写文章、修改系统文件……只要是编辑文本的事儿Vim都能干。但Vim和记事本有个本质区别对比Windows记事本Vim编辑方式打开就能打字需要先进入插入模式才能打字操作方式全靠鼠标和菜单全靠键盘快捷键手不离键盘功能只有最基本的编辑语法高亮、代码补全……3.1 vi vs vim简单来说vim是vi的升级版兼容vi的所有指令支持语法高亮支持可视化操作支持插件扩展3.2 三大核心模式各模式功能命令模式移动光标、删除、复制、粘贴 ——默认进入的模式插入模式真正的文本输入 —— 只有在这里才能打字底行模式保存文件、退出Vim、查找替换、设置行号3.3 模式切换操作说明vim filename进入Vim默认在命令模式i在光标当前位置进入插入模式a在光标下一个位置进入插入模式o新开一行进入插入模式ESC从插入模式返回命令模式:从命令模式进入底行模式ESC或 删除全部命令从底行模式返回命令模式3.4 命令模式常用操作光标移动按键功能按键功能h左移l右移j下移k上移gg跳到文件开头G(Shiftg)跳到文件末尾^跳到行首$跳到行尾w跳到下个单词开头b跳到上个单词开头e跳到单词结尾nG跳到第n行删除操作命令说明x删除光标所在字符nx删除光标后n个字符X删除光标前一个字符dd删除整行ndd删除从光标开始往下n行复制粘贴命令说明yy复制当前行nyy复制n行p在光标后粘贴yw复制一个单词撤销与恢复命令说明u撤销上一次操作可多次Ctrl r恢复撤销的操作3.5 底行模式常用操作命令说明:w保存文件:q退出Vim:wq保存并退出:q!强制退出不保存:set nu显示行号:set nonu取消行号:/关键字向下查找关键字按n继续查找:?关键字向上查找关键字:n跳转到第n行:%s/old/new/g全局替换3.6 Vim配置让Vim更好用配置文件位置系统级/etc/vimrc所有用户生效用户级~/.vimrc当前用户生效推荐基础配置加到~/.vimrcsyntax on 语法高亮 set nu 显示行号 set shiftwidth4 缩进4个空格 set tabstop4 Tab键宽度4个空格 set expandtab Tab展开为空格 set autoindent 自动缩进 set cursorline 高亮当前行四、gcc/g编译器 —— 代码的“翻译官”编译的四个阶段阶段选项输入输出主要工作预处理-E.c.i宏替换、头文件展开、去注释、条件编译编译-S.i.s语法检查、生成汇编代码汇编-c.s.o汇编代码→机器码二进制链接无.o可执行文件链接库函数、生成最终程序实际操作示例# 1. 预处理展开头文件、替换宏 gcc -E hello.c -o hello.i # 2. 编译生成汇编代码 gcc -S hello.i -o hello.s # 3. 汇编生成目标文件二进制 gcc -c hello.s -o hello.o # 4. 链接生成可执行文件 gcc hello.o -o hello # 一步到位最常用 gcc hello.c -o hello在C/C程序开发中我们写的代码最终要变成可执行程序需要经过四个阶段预处理 → 编译 → 汇编 → 链接。其中链接阶段就是把多个目标文件.o文件和库文件组合在一起生成最终的可执行文件。而“链接”的方式主要有两种静态链接和动态链接。这两种方式分别依赖静态库和动态库。什么是静态链接静态链接是指在编译链接阶段将程序所依赖的库函数的全部代码直接复制到最终的可执行文件中。什么是静态库静态库是提前编译好的一组目标文件.o的集合通常打包成一个文件。Linux下后缀为.aArchive例如libc.aWindows下后缀为.lib静态链接的特点优点缺点运行时不再依赖外部库部署简单生成的可执行文件体积大执行速度快无需运行时加载库多个程序共用同一库时内存中有多份副本浪费内存库升级时需要重新编译整个程序更新库困难维护成本高示例Linux下# 使用静态链接编译 gcc hello.c -o hello_static -static # 查看文件大小 ls -lh hello_static什么是动态链接动态链接是指在编译链接阶段并不将库代码复制到可执行文件中而是仅在可执行文件中记录所依赖的库名和符号信息。在程序运行时由操作系统动态加载所需的库到内存中并完成链接。什么是动态库动态库是编译好的、可被多个程序共享的代码模块。Linux下后缀为.soShared Object例如libc.so.6Windows下后缀为.dllDynamic Link Library动态链接的特点优点缺点可执行文件体积小运行时必须依赖对应的动态库“库依赖问题”多个程序可共享内存中的同一份库代码节省内存库版本不一致可能导致程序无法运行“DLL地狱”库升级只需替换库文件无需重新编译程序运行时加载库会带来一定性能开销示例Linux下# 默认使用动态链接 gcc hello.c -o hello_dynamic # 查看依赖的动态库 ldd hello_dynamic静态链接 vs 动态链接对比项静态链接动态链接原理编译时将库代码复制到可执行文件运行时加载共享库文件大小大小内存占用每个程序都有库副本浪费内存多个程序共享同一份库更新库更新需重新编译程序库更新无需重编译程序后缀.a(Linux) /.lib(Windows).so(Linux) /.dll(Windows)默认方式需加-static选项gcc默认# 查看程序依赖的动态库 ldd hello # 输出示例 # linux-vdso.so.1 # libc.so.6 /lib64/libc.so.6 # /lib64/ld-linux-x86-64.so.2动态库 vs 静态库对比项静态库.a动态库.so链接时机编译链接阶段运行时加载可执行文件大小大小内存占用多多份副本少共享部署复杂度低独立运行高需保证库存在且版本正确库升级需重新编译程序只需替换库文件典型后缀.aLinux、.libWindows.soLinux、.dllWindows实际操作生成并使用静态库和动态库1. 准备源文件// add.c int add(int a, int b) { return a b; } // sub.c int sub(int a, int b) { return a - b; }2. 生成静态库.a# 编译成目标文件 gcc -c add.c -o add.o gcc -c sub.c -o sub.o # 打包成静态库 ar -rc libmymath.a add.o sub.o # 使用静态库编译主程序 gcc main.c -o main_static -L. -lmymath3. 生成动态库.so# 编译成位置无关代码的目标文件 gcc -fPIC -c add.c -o add.o gcc -fPIC -c sub.c -o sub.o # 生成动态库 gcc -shared -o libmymath.so add.o sub.o # 使用动态库编译 gcc main.c -o main_dynamic -L. -lmymath # 运行前需指定库路径 export LD_LIBRARY_PATH.:$LD_LIBRARY_PATH ./main_dynamic五、自动化构建 —— make / Makefile5.1 为什么需要 Makefile当项目包含成百上千个源文件时手动输入编译命令不现实。Makefile 定义了依赖关系和生成规则make命令自动判断哪些文件需要重新编译极大提升效率。5.2 一个最简单的 Makefilemyproc: myproc.c gcc -o myproc myproc.c .PHONY: clean clean: rm -f myprocmyproc是目标文件依赖myproc.c依赖文件的修改时间新于目标文件时才会执行下方的命令.PHONY声明伪目标clean总是被执行无论文件是否存在5.3 make 执行流程在当前目录找Makefile或makefile执行第一个目标默认目标递归检查依赖链按需编译若最终依赖缺失报错退出5.4 进阶写法变量与自动推导BIN : myproc #定义一个变量 BIN值为 myproc最终生成的可执行文件名 CC : gcc #定义变量 CC值为 gccC 编译器 SRC : $(wildcard *.c) #定义变量 SRC值为当前目录下所有 .c 文件的列表 OBJ : $(SRC:.c.o) #定义变量 OBJ将 SRC 中所有 .c 后缀替换为 .o #定义生成最终可执行文件的规则 $(BIN): $(OBJ) $(CC) -o $ $^ # $ 目标名$^ 所有依赖 #定义通用规则将任意 .c 文件编译成同名的 .o 文件 %.o: %.c $(CC) -c $ # $ 第一个依赖 .PHONY: clean clean: rm -f $(OBJ) $(BIN) #定义清理规则删除所有目标文件和可执行文件第一个 Linux 程序 —— 进度条回车\r与换行\n的区别\n换行Newline将光标移到下一行同一列\r回车Carriage Return将光标移到当前行首在老式打字机上\r\n表示回到行首并换行。Linux 下\n已包含换行回车而\r单独使用时可以实现原地刷新效果。行缓冲区的概念printf(hello); // 不换行内容暂存在缓冲区 sleep(3); // 等待 3 秒但看不到输出为什么因为 stdout 默认是行缓冲遇到\n或程序结束才刷新。强制刷新printf(hello); fflush(stdout); // 立即输出 sleep(3);倒计时与进度条核心逻辑倒计时10 秒int i 10; while (i 0) { printf(%-2d\r, i); fflush(stdout); i--; sleep(1); }进度条简化版char buffer[101] {0}; const char *lable |/-\\; int cnt 0; while (cnt 100) { printf([%-100s][%d%%][%c]\r, buffer, cnt, lable[cnt % 4]); fflush(stdout); buffer[cnt] #; usleep(50000); // 50ms } printf(\n);六、版本控制器 —— Git6.1 Git 是什么Git 是目前最流行的分布式版本控制系统它能记录文件的每一次修改支持多人协作、分支管理、版本回退等。6.2 安装与配置# CentOS sudo yum install -y git # Ubuntu sudo apt install -y git git --version # 检查版本 # 首次使用需配置用户信息否则 commit 会报错 git config --global user.name Your Name git config --global user.email youexample.com6.3 Git 三板斧命令作用git add file将文件添加到暂存区告诉 git 要管理它git commit -m 说明提交改动到本地仓库git push将本地提交推送到远程仓库如 GitHub完整流程示例# 1. 克隆远程仓库到本地 git clone https://github.com/yourname/project.git # 2. 修改代码后 git add main.c git commit -m fix: 修复进度条显示异常 git push # 输入 GitHub 用户名和密码或 token6.4 其他常用命令git status查看当前修改状态git log查看提交历史git pull拉取远程最新代码同步git diff查看具体改动内容七、调试器 —— gdb / cgdb7.1 为什么要用 gdb程序出了 bug光靠printf打日志效率太低。gdb 支持断点、单步执行、变量监视、栈回溯等是 Linux 下 C/C 调试的标配。7.2 编译时需加 -ggcc -g mycmd.c -o mycmd # 生成包含调试信息的程序 file mycmd # 查看是否包含 debug_info不加-g则无法使用 gdb 调试。7.3 常用调试命令命令简写作用runr开始运行程序breakb设置断点b 行号/b 函数名/b 文件名:行号nextn单步执行不进入函数内部F10steps单步执行进入函数内部F11continuec继续运行到下一个断点printp打印变量值p idisplay-持续跟踪变量每次停止时自动显示undisplay-取消跟踪finish-执行完当前函数并返回backtracebt查看调用栈info breakpointsinfo b查看所有断点deleted删除断点d 1删除 1 号断点quitq退出 gdb7.4 高级技巧watch —— 监视变量变化(gdb) watch result # 当 result 变化时自动暂停set var —— 临时修改变量值(gdb) set var flag1 # 强行改值验证是否是它导致的问题条件断点# 方式1新增时带条件 b 9 if i 30 # 方式2给已有断点追加条件 condition 2 i 30适用于循环体中只在特定迭代停下来检查。分屏调试推荐 cgdbcgdb 是 gdb 的增强版上屏显示代码下屏输入命令体验更接近 IDE。# CentOS sudo yum install -y cgdb # Ubuntu sudo apt install -y cgdb