【Linux】开发工具链全解析:从 apt 到 gdb
作者yuuki233233目标德国 CS 本科 特斯拉软件工程师适用人群大一/自学者想快速上手 Linux 命令行 搞懂权限本质这篇博客主要讲解了软件包管理器、编译器、vim 编制器、自动化构建工具、gdb 调试的作用这是一份针对 Linux 的实用开发工具是学习 Linux 的重要路程欢迎点赞、收藏、评论一起卷 LinuxLinux开发工具1. 软件包管理器1.1 Linux 软件安装三种方式1.2 apt 具体操作1.2.1 apt 常用命令速查1.2.2 apt 源配置文件sources.list2. 编译器 gcc 和 g2.1 编译器处理代码过程2.1.1 预处理宏替换2.1.2 编译生成汇编2.1.3 汇编生成机器可识别代码2.1.4 链接生成可执行文件或库文件2.2 动态链接和静态链接2.1 动态链接2.2 静态链接2.3 静态库和动态库3. vim 使用3.1 命令模式command mode3.1.1 移动光标在命令模式下3.1.2 其他操作3.2 插入模式insert mode3.3 底行模式last line mode3.4 注释模式3.5 替换模式4. Linux项目自动化构建工具 make 和 Makefile4.1 为什么有 make 和 makefile4.2 make 和 makefile 的基础使用4.2.1 创建文件4.2.2 删除文件4.2.3 Makefile 顺序问题4.2.4 文件属性 及 时间问题1文件信息2Modify 时间问题3为什么不被执行多次 make4.PHONY 伪目标使用4.2.5 Makefile 深层理解推导过程4.2.6 Makefile 定义变量4.2.7 多文件 Makefile手写链接4.2.8 多文件 Makefile自动链接5. 调试器 gdb 和 cgdb5.1 gdb/cgdb 使用前提5.2 gdb/cgdb 常见使用命令1. 软件包管理器1.1 Linux 软件安装三种方式方式优点缺点推荐场景包管理器yum/dnf/apt自动解决依赖、版本兼容、卸载干净软件版本可能较旧、需要配置镜像加速服务器、生产环境首选源码编译安装最新版本、可自定义配置、优化编译参数依赖手动解决、编译耗时、卸载麻烦需要最新版或特殊优化时二进制包.deb/.rpm/.tar.gz安装快、免编译依赖问题、路径不标准、可能污染系统临时用或官方不提供包时二进制包本质就是把编译好的可执行文件、库、配置文件、手册页等按标准路径/usr/bin、/usr/lib、/etc、/usr/share/man直接解压/拷贝过去所以叫“安装 拷贝资源”包管理器是服务器/日常使用首选因为它把“下载 → 依赖检查 → 安装 → 注册服务 → 更新源”全部自动化了。 在 Ubuntu/Debian 系上最常用的是apt底层是 dpkg。1.2 apt 具体操作1.2.1 apt 常用命令速查命令作用示例sudo apt update更新软件源索引必须先执行每次换源或想获取最新包列表时运行sudo apt upgrade升级所有已安装软件保持系统最新推荐定期运行sudo apt install 软件名安装软件自动解决依赖sudo apt install vim git curlsudo apt remove 软件名卸载软件保留配置文件sudo apt remove nginxsudo apt purge 软件名彻底卸载连配置文件一起删sudo apt purge nginxsudo apt autoremove自动清理不再需要的依赖包卸载软件后运行释放空间sudo apt search 关键词搜索软件包sudo apt search python3-pipsudo apt list --installed列出已安装软件查看系统中装了哪些包1.2.2 apt 源配置文件sources.listUbuntu 的软件源配置文件在/etc/apt/sources.list /etc/spt/sources.list.d/*.list换国内镜像加速推荐国外源在中国慢得离谱备份原文件sudocp/etc/apt/sources.list /etc/apt/sources.list.bak用国内镜像替换以阿里云为例推荐速度最稳sudo sed -i s/archive.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list sudo sed -i s/security.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list更新索引sudo apt update其他常用镜像清华mirrors.tuna.tsinghua.edu.cn中科大mirrors.ustc.edu.cn网易mirrors.163.com小技巧换源后如果报错先运行sudo apt update --fix-missing修复。2. 编译器 gcc 和 g2.1 编译器处理代码过程gcc编译选项gcc[选项]要编译的文件[选项][目标文件]编译器处理过程预处理进行宏替换/去注释/条件编译/头文件展开等编译生成汇编汇编生成机器可识别代码链接生成可执行文件或库文件2.1.1 预处理宏替换运行gcc -E hello.c -o hello.i预处理功能主要包括宏定义文件包括条件编译去注释等预处理指令是以#号开头的代码行选项-E的作用让 gcc 在预处理结束后停止编译选项-o的作用写入到目标文件.i文件为预处理后的 C 原始程序2.1.2 编译生成汇编运行gcc –S hello.i –o hello.sgcc 首先检查代码的规范性无误后 gcc 把代码翻译成汇编语言选项-S的作用进行查看只进行编译而不进行汇编生成汇编代码2.1.3 汇编生成机器可识别代码运行gcc –c hello.s –o hello.o把编译生成的.s文件转成目标文件选项-c的作用看到汇编代码已经转化为.o的二进制目标代码2.1.4 链接生成可执行文件或库文件运行gcc hello.o –o hello成功编译进入链接阶段程序在翻译时喜欢做的先编译成.o再链接编译器在编译时不仅仅要形成可执行文件还要形成库如果形成库的话就不需要编译成可执行程序必须形成-o最后进行操作。目前使用的 VS 编译时就只形成一个可执行程序如果文件过多就会形成多个可执行程序损耗效率。多个文件将全部.c打包成.o再进行链接形成可执行文件gcc code.o code1.o code2.o-ocode2.2 动态链接和静态链接2.1 动态链接动态链接是在编译还没加载时就链接好了动态链接只是把我们要访问的库资源的地址写到我的程序当中当我加载之后动态找到对应的库就执行/* 库 */ /* 代码 */ // 地址libc.so:地址 int printf(...) for() { ...; } { // 链接动态库把printf替换成libc.so:地址 printf(hello world); }动态链接的好处把程序分成各个独立部分运行时链接在一起不像静态链接把所有程序模块都链接成一个单独的可执行文件2.2 静态链接把程序中使用的库拷贝给我自己静态库只有在链接的时候有用一旦形成可执行程序静态库可以不再需要/* 库 */ /* 代码 */ // 地址libc.so:地址 int printf(...) for() { ...; } { // 拷贝一份libc.so:地址给printf用 printf(hello world); }静态链接的好坏运行速度快可执行程序中具备所有执行程序所需要的任何东西浪费空间每个可执行程序中对所有需要的目标文件都要有一份副本所有多个程序会依赖同个文件同一个目标文件都在内存存在多个副本更新困难每改库函数是需要重新进行编译链接形成可执行程序。2.3 静态库和动态库静态库libc.a)编译链接是把库文件的代码全部加入到可执行文件中结果生成文件较大运行时就不需要库文件后缀名一般为.a动态库libc.so与静态库相反结果编译链接时而是在程序执行时由运行时链接文件加载库节省开销后缀名为.so我们自己的程序 动态库内部实现的方法 - 形成可执行程序让我们自己的程序能在库中找到方法需跳转到库中执行完了再返回动静态库对比动态库形成的可执行程序体积一定很小可执行程序对静态库的依赖度小动态库不能缺失程序运行需要加载内存静态链接的会在内存中出现大量重复代码动态链接用的是动态库的地址比较节省内存和磁盘资源gcc 在编译时默认使用动态库完成链接后就可以生成可执行文件动态库linux(.so) windows(.dll)静态库linux(.a) windows(.lib)3. vim 使用vim 编辑器分为五种模式命令模式command mode、插入模式insert mode、底行模式last line mode、替换模式、注释模式命令模式可以转成其他模式其他模式只能转回命令模式3.1 命令模式command mode命令模式iinsert/ o往下空新起一行/ a往后移一字符插入模式:末行模式R替换模式ctrl v注释模式3.1.1 移动光标在命令模式下目的指令左下上右h(左) j(下) k(上) l(右)顶部gg底部G指定行[行数] G跳跃单个单词w(右) b(左)跳跃多个单词[跳跃单词数] w 、[跳跃单词数] b行首^行尾$3.1.2 其他操作目的指令复制当 前行/多行yy/[数] yy光标位置粘贴 一次/多次p/[数] p向前撤销u向后撤销ctrl r截切 一行/多行dd/[数] dd右删除字符可复制x/[数] x左删除字符可复制X/[数] X替换光标所在字符r/[数] r大小写切换~选中单词#n逆向查找3.2 插入模式insert mode可进行文字输入按Esc回到命令模式3.3 底行模式last line mode命令用途w保存q退出!q强制退出set nu设置行号! [命令]在vim中使用命令%s /dst/srt/批量化替换vs 新文件、ctrl ww分屏、切换文件/单词查找单词vim 文件 行号让光标指到对应位置!v执行上一个底行指令Esc回到命令模式3.4 注释模式步骤批量化注释区域删除区域编写1h j k l区域选择可与其他命令结合h j k l区域选择h j k l区域选择2I大写回到插入模式d删除选择区域I大写回到插入模式3输入//输入想要加的字符4按Esc批量注释成功按Esc区域编写成功按Esc回到命令模式3.5 替换模式按Esc回到命令模式4. Linux项目自动化构建工具 make 和 Makefile4.1 为什么有 make 和 makefile一个工程的源文件不计其数按类型、功能、模块分别放在若干个目录中makefile定义了一个系列的规则来指定哪些文件需要先编译哪些文件需要后编译哪些文件需要重新编译甚至进行更复杂的功能操作makefile 好处自动化编译一旦写好只需一个make命令让整个工程完全自动编译make命令解释makefile中指令的命令工具4.2 make 和 makefile 的基础使用可写成makefile或Makefile4.2.1 创建文件先创建一个目录在目录里分别创建Makefile与myproc.c2个文件mkdirlesson9cdlesson9# lesson9touchMakefile myproc.cmyproc.c里只有输出hello world的代码进入Makefile中往里面写入下列命令# Makefile# 目标文件:依赖文件 myproc.c (怎么形成)- myprocmyproc:myproc.c# 可以是多个依赖文件gcc-omyproc myproc.c# 第二行必须以tap建为开头以什么方式编译输入make指令自动输出一个myproc文件# lesson9make# 出现 gcc -o myproc myproc.c (也就是我们在 Makefile 中写入的)此时出现一个myproc文件./myproc输出hello world4.2.2 删除文件上面执行了创建文件的命令那也可以执行删除的命令进入Makefile# Makefilemyproc:myproc.c# 可以是多个依赖文件gcc-omyproc myproc.c# 第二行必须以tap建为开头以什么方式编译.PHONY:clean# .PHONY:修饰符 修饰 cleanclean:# 依赖为空语法规则一样rm-fmyproc退出Makefilemakeclean# 出现 rm -f myproc (也就是我们在 Makefile 中写入的 clean)此时myproc文件已被删除4.2.3 Makefile 顺序问题我们把上面写的Makefile拆解一番# 第一个命令(make)myproc:myproc.c gcc-omyproc myproc.c .PHONY:clean# 伪目标# 第二个命令(make clean)clean:rm-fmyproc因为Makefile顺序问题在执行make命令时最先执行gcc -o myproc myproc.c只有明确告知需要用clean时执行make clean才会执行rm -f myproc如果像下列这样写# 第一个命令(make)clean:rm-fmyproc .PHONY:clean# 伪目标# 第二个命令(make myproc)myproc:myproc.c gcc-omyproc myproc.c会因为顺序问题执行make时就变成rm -f myproc但我们都会把创建文件放在第一个4.2.4 文件属性 及 时间问题在执行多个make时只有第一次是通过的其余都报错那是因为两个文件myproc.cmyproc的属性问题而导致的1文件信息我们用stat myproc.c能看到文件的基本信息包括查看时间、修改时间、属性修改时间[zjhizj6cd3zr5adf6jnm3mwihz lesson9]$statmyproc.c File: ‘myproc.c’ Size:79Blocks:8IO Block:4096regularfileDevice: fd01h/64769d Inode:139526Links:1Access:(0664/-rw-rw-r--)Uid:(1001/ zjh)Gid:(1001/ zjh)Access:2026-03-1422:50:56.325289332 0800# 查看时间Modify:2026-03-1422:50:56.324289316 0800# 修饰时间Change:2026-03-1422:50:56.324289316 0800# 修改属性时间Birth: -文件信息AccessModifyChange修改cat只对第一次 cat 有效vimvim、chmodmodify 更改Change也跟着更改2Modify 时间问题不能make多次与Modify的修改时间息息相关想用多次make需要更改Modify的修改时间3为什么不被执行多次 make默认老代码不做重新编译当有1000份文件时只修改了10份文件就只make修改过的文件若make 1000份文件对性能会有消耗怎么不做重新编译的每个文件都有不同的修改时间(Modify)以myproc和myproc.c为例当myproc.c时间比myproc晚时make时就不会执行因为当成myproc.c是老文件没有被修改要是myproc.c被修改时myproc.c时间比myproc早make时就会执行因为当成myproc.c是新文件已被修改4.PHONY 伪目标使用参考以下Makefile文件.PHONY:clean clean:rm-fmyproc .PHONY:clean myproc:myproc.c gcc-omyproc myproc.c会发现可以执行多次make是因为.PHONY类似一张通行证可以一直反复往来一个地方所以可以无视myproc文件执行多次make为什么给删除通行主要是因为项目清理时要保证每一次清理时是干净的就不会出现奇奇怪怪的错误结论.PHONY:让 make 忽略源文件和可执行目标文件的 M 时间对比4.2.5 Makefile 深层理解推导过程机器只能识别.o文件那为什么Makefile文件中可以写成myproc:myproc.c呢那是因为 Linux 中优化了Makefile省略了许多步骤完整的路线图如下#myproc:myproc.c# gcc -o myproc myproc.cmyproc:myproc.o gcc myproc.o-omyproc myproc.o:myproc.s gcc-cmyproc.s-omyproc.o myproc.s:myproc.i gcc-Smyproc.i-omyproc.s myproc.i:myproc.c gcc-Emyproc.c-omyproc.i .PHONY:clean clean:rm-f*.i *.s *.o myprocmyproc:myproc.o这里的myproc.o不存在把myproc:myproc.o入栈myproc.o:myproc.s这里的myproc.s不存在把myproc.o:myproc.s入栈myproc.s:myproc.i这里的myproc.i不存在把myproc.s:myproc.i入栈myproc.i:myproc.c这里的myproc.c存在依次出栈并执行从此就完成了从上到下入栈从下到上执行的Makefile推导规则4.2.6 Makefile 定义变量Linux中的Makefile里定义变量与C语言中的宏定义很像本质是替换。C语言的语法为#default、Linux中则为$()特殊语法$()替换内容、$^表示依赖文件、$表示目标文件# 定义的变量BINproc.exeCCgccSRCmyproc.cFLAGS-oRMrm-f# 替换$()$(BIN):$(SRC)$(CC)$(FLAGS)$$^# $ BIN $^ SRC.PHONY: clean:$(RM)$(BIN).PHONY:test test: echo$(BIN)# 输出 proc.exeecho$(CC)# 输出 gccecho$(SRC)# 输出 myproc.cecho$(FLAGS)# 输出 -oecho$(RM)# 输出 rm -f4.2.7 多文件 Makefile手写链接多文件的Makefile写法 与 上述单文件的Makefile写法不同如下将多个文件编译成.o统一链接BINproc.exeCCgccSRCmyproc.cOBJmyproc.oLFLAGS-oFLAGS-cRMrm-f$(BIN):$(OBJ)$(CC)$(LFLAGS)$$^ %.o:%.c# 把当前路径下所有的 .o/.c 依次展开$(CC)$(LFLAGS)$# 对源文件依次进行编译.PHONY:clean clean:$(RM)$(OBJ)$(BIN)不想每次make和make clean打印命令可以用来注释掉BINproc.exeCCgccSRCmyproc.cOBJmyproc.oLFLAGS-oFLAGS-cRMrm-f$(BIN):$(OBJ)(CC)$(LFLAGS)$$^ echolinking ... $^ to$%.o:%.c# 把当前路径下所有的 .o/.c 依次展开$(CC)$(LFLAGS)$# 对源文件依次进行编译echocompling ... $ to$.PHONY:clean clean:$(RM)$(OBJ)$(BIN)4.2.8 多文件 Makefile自动链接每次使用Makefile都要自己去用.o文件链接如果.o文件特别多这就会失去Makefile文件的便利性因此就有自动链接的语法BINproc.exeCCgcc# SRC$(shell ls *.c)SRC$(wildcard *.c)# 显示当前目录下所有的.c文件名OBJ$(SRC:.c.o)# SRC内部的文件名.c - 文件名.oLFLAGS-oFLAGS-cRMrm-f$(BIN):$(OBJ)(CC)$(LFLAGS)$$^ echolinking ... $^ to$%.o:%.c# 把当前路径下所有的 .o/.c 依次展开$(CC)$(LFLAGS)$# 对源文件依次进行编译echocompling ... $ to$.PHONY:clean clean:$(RM)$(OBJ)$(BIN).PHONY:test test: echo$(SRC)echo$(OBJ)对Makefile自动链接进行测试# 在lesson9中输入count1;while[$count-le100];dotouchcode${count}.c;letcount;done可以看到创建了 100 个.c文件此时使用make和make clean时就可以看到创建.o和链接的输出5. 调试器 gdb 和 cgdb5.1 gdb/cgdb 使用前提gdb 与 cgdb 最大的区别是cgdb 有动态过程而 gdb 没有程序有两种模式debug和release模式Linux gcc/g出来的二进制程序默认是release要使用 gdb/cgdb 调试必须在源代码生成二进制程序时加上-g选项gcc code.c-ocode-g# debug模式cgdb code# 一定是要可执行文件不是 code.c5.2 gdb/cgdb 常见使用命令开始gdb binFile退出ctrl d或quit调试命令命令作用样例list/l显示源代码从上次位置开始每次列出10行l 10list/l 函数名列出指定函数的源代码l mainlist/l 文件名:行号列出指定文件的源代码l mycmd.c:1r/run从程序开始连续执行rn/next单步执行不进入函数内部VS F10ns/step单步执行进入函数内部VS F11sbreak/b 文件名:行号在指定行号设置断点b 10/b test.c:10break/b 函数名在函数开头设置断点b maininfo break/b查看当前所有断点的信息info bfinish执行到当前函数返回然后停止finishprint/p 表达式打印表达式的值p startendp 变量打印指定变量的值p xset var 变量值修改变量的值set var i10continue/c从当前位置开始连续执行程序cdelete/d breakpoints删除所有断点d breakpointsdelete/d n删除序号为n的断点d 1disable breakpoints禁用所有断点disable breakpointsdisable n禁用序号为n的断点disable 1enable breakpoints启用所有断点enable breakpointsenable n启用序号为n的断点enable 1info/i breakpoints查看当前设置的断点列表info bdisplay 变量名跟踪显示指定变量的值display xundisplay 编号取消对指定编号的变量的跟踪显示undisplay 1backtrace/bt查看当前执行栈的各级后汉书调用及参数btuntil 行号执行到指定行号until 20info/i locals查看当前栈帧的局部变量值info localsquit退出GDB调试器qwatch 变量当跟踪值变化时GDB辉暂停程序的执行watch xb 文件名/行号/函数名 if i 30给断点加上条件条件满足时执行断点b 10 if i 20condition 序号 i 30给存在的断点加条件condition x i 30按Esc进入代码屏/按i退出进入代码屏可以用滚轮滑动cgdb上显示的代码按Esc进入代码屏/按i退出代码仓库https://github.com/yuuki233233/cpp-learning-journeyCSDN 主页https://blog.csdn.net/yuuki233233欢迎评论交流一起卷 C/C 与 Linux
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2429336.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!