软件开发的商业动机盈利模式VIP服务、广告投放、生态建设开源战略非完全免费而是长期商业策略生态价值成熟的生态系统吸引更多用户和开发者开源软件通过提供免费基础功能来建立用户基础然后通过企业版、技术支持、云服务等方式实现商业化盈利。就像商场提供免费的休息区和WiFi吸引客流后再通过店铺销售盈利 Linux 软件安装方式方式优点缺点推荐度源代码安装完全自定义依赖复杂容易出错⭐rpm 安装预编译快速需手动解决依赖关系⭐⭐yum 安装自动解决依赖统一管理需要网络连接⭐⭐⭐yum 就像Linux的应用商店让安装软件变得简单快捷。 yum 工作机制yum 如何实现精确下载核心原理yum 内置了软件地图包含所有软件的精确下载地址软件之间的依赖关系版本信息和完整性校验镜像加速机制问题yum 官方仓库在国外下载慢且不稳定解决方案国内镜像服务器系统已预配置国内镜像源定期同步官方仓库提供高速稳定的下载代码语言javascriptAI代码解释客户端 (yum) → 软件仓库 (repository) ↓ ← 网络 镜像服务器 (国内加速)yum 就像是Linux系统的应用商店开源生态的智慧为什么有人为免费系统开发软件答案Linux用户主要是程序员和企业具有更高商业价值开源商业模式免费基础版 收费企业版技术支持和服务收费云服务和培训认证生态重要性选择操作系统时软件生态比个人习惯更重要 因此开发者会积极建设生态来吸引用户软件源类型官方源(base-repo)系统默认提供应用商店下载扩展源(epel-release)额外软件包浏览器下载代码语言javascriptyum install -y epel-release # 安装扩展源代码语言javascriptAI代码解释--- --- ### yum 指令详解 #### **常用操作** - list查看软件列表 - install安装软件 - remove卸载软件 --- #### 常用选项 - -y --- #### 操作示例 Shell # 查看软件库 yum list # 搜索软件 yum list | grep [软件名] # 安装软件 yum install [软件名.版本号] # 卸载软件 yum remove [软件名.版本号] # 查看已安装 yum list installed实用软件示例使用rzsz实现 Linux 与 Windows 文件互传代码语言javascriptAI代码解释# 安装 rz/szCentOS/RedHat yum install lrzsz # 从 Windows 上传文件到 Linux rz # 从 Linux 下载文件到 Windows sz [文件名]小贴士rz/sz 是通过终端进行文件传输的简单工具适合小文件传输。对于大文件或图形界面环境可以考虑使用 SFTP 或共享文件夹等方式。趣味软件示例代码语言javascriptAI代码解释yum install -y sl # 蒸汽机车动画在这里插入图片描述代码语言javascriptAI代码解释yum install -y cowsay # 会说话的牛在这里插入图片描述软件的安装需要 root权限使用 root身份安装使用 sudo下面会讲如何将普通用户添加进白名单在Linux中我们怎么知道需要安装那些软件呢无他唯手熟尔✏️ 文本编辑器 Vimvim有一定学习门槛是一款十分优雅的编辑器会了vim其它文本编辑器就是手到擒来多模式设计哲学在这里插入图片描述Vim 让我们的手不用离开键盘就能完成一系列文本编辑操作命令模式操作1. 光标导航代码语言javascriptAI代码解释gg 跳到文件开头 G 跳到文件末尾 nG 跳到第n行 ^ 跳到行首 $ 跳到行尾 nw/b 向前/后移动n个单词可跨行 nh/j/k/l 向左/下/上/右移动n个字符2. 文本操作代码语言javascriptAI代码解释nyy 复制n行 np 粘贴n次 ndd 删除n行 nr 替换光标后n个字符 R 批量替换 n~ 改变光标后n个字符大小写 nx 删除光标后n个字符 u 撤销 Ctrlr 重做撤销之前的撤销操作 * 查询光标处匹配项3. 多文件编辑代码语言javascriptAI代码解释:vs filename 垂直分屏打开文件 Ctrlww 切换工作窗口底行模式操作代码语言javascriptAI代码解释:wq! 强制保存退出 :set nu 显示行号 :set nonu 隐藏行号 :/keyword 搜索关键词 :!gcc file.c 编译文件 :!./a.out 运行程序说明底行模式下指令开头/结尾!表述强制执行查看二进制文件代码语言javascriptAI代码解释vim -d [文件名]在 vim 底行模式下输入%!xxd补充文本编辑器查看二进制文件乱码是因为它默认将二进制序列依据ASCII码翻译成了文本信息Vim 配置配置文件位置~/.vimrc没有可以自行创建个性化配置不会影响其他用户推荐使用现成配置方案快速搭建环境代码语言javascriptAI代码解释# 将以下指令粘贴到Linux系统执行就能一键完成Vim配置 curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh bash ./install.sh**注意**尽量不要用root身份进行配置操作保持默认配置更安全。 权限管理 sudo在了解sudo指令之前我们一些的操作都要切换到root身份进行非常的麻烦权限控制模型代码语言javascriptAI代码解释普通的用户 → 保安检查 → 权限判断 白名单用户 → 直接放行 黑名单用户 → 直接拒绝sudo 白名单配置方法普通用户无法使用sudo是因为没有访问/etc/sudoers文件的权限但root又不可能直接修改配置文件本身的访问权限这样相当于完全放权了谁都能sudo不是给自己挖坑吗1. 切换到 root 用户在这里插入图片描述2. 编辑/etc/sudoers文件在这里插入图片描述3. 添加白名单用户大约在第100行左右在这里插入图片描述说明这样任何一个普通用户想要进入白名单就必须经过管理员同意 编译器 GCC/G编译流程四阶段代码语言javascriptAI代码解释源文件 → 预处理 → 编译 → 汇编 → 链接 ↓ ↓ ↓ ↓ .i文件 .s文件 .o文件 可执行文件1. 预处理代码语言javascriptAI代码解释gcc -E hello.c -o hello.i头文件展开#include内容插入宏替换简单文本替换无类型检查条件编译平台适配、功能裁剪去注释删除所有注释内容2. 编译代码语言javascriptAI代码解释gcc -S hello.i -o hello.sC代码 → 汇编代码语法分析和优化3. 汇编代码语言javascriptAI代码解释gcc -c hello.s -o hello.o汇编代码 → 机器码生成目标文件4. 链接代码语言javascriptAI代码解释gcc hello.o -o hello组合目标文件和库文件解析外部引用为什么需要库避免重复造轮子提供标准功能实现保护源代码动态链接 vs 静态链接动态链接共享库小故事理解你考上高中但学校禁网学长告诉你网吧位置。当你想上网时就去网吧其他同学也可以去同一家网吧。特点运行时加载多个程序共享节省磁盘、内存资源库文件缺失会影响所有依赖程序静态链接小故事续集网吧被查封后你在学长开的二手电脑店买了电脑从此在家就能上网不再依赖网吧。特点编译时嵌入独立执行程序独立运行不依赖外部库体积较大占用更多资源类型LinuxWindows特点动态库.so.dll1. 运行时加载多个程序共享节省磁盘、内存资源库文件缺失会影响所有依赖程序| |静态库|.a|.lib|编译时嵌入独立执行|生动的库链接比喻动态链接你想上网但学校不让带电脑。学长告诉你“学校旁边有网吧”。你需要上网时就去网吧多个同学可以共享同一个网吧。如果网吧关门了大家都上不了网。静态链接网吧关门后你从二手市场买了台电脑放在宿舍。现在你可以随时上网不依赖外部环境但需要自己维护电脑。编译器选择gccC语言程序链接C标准库gC程序链接C标准库兼容C编译选项代码语言javascriptAI代码解释# 记忆技巧ESC对应gcc选项 gcc -E test.c # 只预处理 gcc -S test.c # 编译到汇编 gcc -c test.c # 编译到目标文件 gcc test.c -o test # 生成可执行文件 gcc test.c -o test -static # 静态链接 gcc test.c -o test -g # 生成调试版本 file test # 查看可执行文件信息调试器 GDBDebug vs Release 版本代码语言javascriptAI代码解释# 生成可调试版本 gcc -g test.c -o test # 检查是否包含调试信息 readelf -S test | grep -i debug注意gcc默认编译生成的是release版本无法直接调试GDB 基本使用代码语言javascriptAI代码解释gdb test # 启动调试 l # 查看代码(list) b n # 在第n行设置断点(break) b main # 在main函数设置断点 info b # 查看所有断点 d n # 删除n号断点(delete) r # 运行程序(run) s # 单步进入(step into) n # 单步跳过(step over) c # 继续运行(continue) p variable # 打印变量值(print) display variable # 持续监视变量 undisplay 1 # 取消监视 finish # 运行到当前函数返回 until n # 运行到第n行 q # 退出调试(quit)注意gdb会记住你上次操作下次直接回车表示默认执行上次的指令调试策略选择调试不是唯一选择️打印调试简单问题用printf代码审查仔细阅读代码逻辑工具调试复杂问题用 GDB就像修车小问题自己看看大问题才用专业工具所以不管黑猫白猫能抓到老鼠的就是好猫不要觉得自己的方法习惯就是不入流的️ 项目自动化构建 Makefile什么是 Makefilemake是命令Makefile是配置文件两者配合实现项目自动化构建。