整理了一周近万字讲解linux基础开发工具vim,gdb,gcc,yum等的使用(下)

简介: 整理了一周近万字讲解linux基础开发工具vim,gdb,gcc,yum等的使用(下)

二、gcc/g++的使用



gcc/g++是一个编译器


gcc完成需要以下几个步骤:


1.预处理(头文件展开,条件编译,宏替换,去注释等)


使用: gcc –E hello.c –o hello.i    


-E :从现在开始进行程序的翻译,预处理做完就停下来


gcc -E + 文件名 :直接生成.i文件


gcc -E + 原来的文件名 + 自己想取的文件名(最好后缀为.i,因为.i是预处理后的代码文件):将预处理后的代码文件写入自己命名的文件中


9f05d441f6994321b4b18cbba650a4d9.png

255d6d61cec94233835e61e66220a95a.png

 


2. 编译(生成汇编语言)


在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言

实例: gcc –S hello.i –o hello.s


-S :从现在开始进行程序的翻译,当编译做完就停下来


gcc -S + 文件名:形成汇编代码(默认形成一个.s文件)在这里注意如果刚刚我们已经已经有了预处理后的.i文件那么直接用.i文件即可,如果用原来.c文件则会又进行一次预处理


gcc -S + 原来文件名 + -o + 自己命名的文件名 :形成一个自己指明的汇编文件

1603db189a4942eeb64dfb822d38ad88.png

8c85f18dad904d13a14161c9b8162a0c.png


编译过程为:扫描程序->语法分析->语义分析->源代码优化->代码生成器->目标代码优化;


扫描程序进行语法分析,从左向右,从上往下扫描源程序字符,识别出各个单词,确定单词类型。


语法分析是根据语法规则,将输入的语句构建出分析树,或者语法树,也就是parse tree或者syntax tree


语义分析是根据上下文分析函数返回值类型是否对应这种语义检测,可以理解语法分析就是描述一个句子主谓宾是否符合规则,而语义用于检测句子的意思是否是正确的


目标代码生成指的是把中间代码变换成为特定机器上的低级语言代码


3. 汇编(可重定位目标二进制文件,不可以被执行的,bin.obj)


汇编阶段是把编译阶段生成的“.s”文件转成目标文件

实例: gcc –c hello.s –o hello.o

-c :从现在开始进行文件的汇编,当汇编完成后就停下来

gcc -c + 文件名(默认形成一个.o文件)形成二进制文件,文件名可以从.s开始也可以重新开始。

gcc -c + 原来文件名 + 自己命名的文件名 :将二进制文件写入自己命名的文件中

3c6c9d0d6b494274ad74d42ec00cd943.png8d963b5b5093404f888c77cd43fb24fb.png


4.链接(将我们这自己形成的.obj文件和库文件等合并,形成可执行程序)


7491bfd8219b4cadb50335bad268b4da.png


ldd + 链接好的文件 :可以显示都链接了哪些库


4f02907d88bb410f8ff4f75575d5e8bd.png


直接gcc + 文件名会形成一个a.out可执行文件,然后./a.out可以直接运行程序


f5d84f61e27747588f8e807347891e15.png


如果想形成一个自己命名的文件:gcc + 文件名 -o + 自己命名的文件


e4a5c77cdd6d461590a810fa92fd9b6b.png


gcc + 文件名 -o + 自己命名的文件-static -static :形成一个静态库


78a6fa34d91f4af6ac8885e590d10db5.png


当出现当出现cannot find -lc时,需要先下载c的静态库  yum install -y libc-static


Linux系统默认已经携带了语言级别的头文件和语言对应的库

ls /usr/include/stdio.h :查看C语言头文件所在位置


静态库   libxxxxx.a      动态库   libxxxxx.so

1.库分为静态库(专门让编译器,对用户的程序进行静态链接的)和动态库(专门让编译器,对用户的程序进行动态链接的)

2.静态库和静态链接:链接的时候,如果是静态链接,找到静态库,拷贝静态库中的我所需要的代码到我自己的可执行程序中

3.动态库和动态链接:链接的时候,如果是动态链接,找到动态库,拷贝动态库中的我所需要的代码的地址到我自己的可执行程序中相关的位置

4.静态链接成功:我们的程序,不依赖任何库,自己就可以独立运行

5.动态链接成功:我们的程序,还是依赖动态库,一旦动态库缺失,我们的程序便无法运行

6.静态库,因为自身拷贝的问题,比较浪费空间

7.动态库,因为可以做到被大家共享,所以真正的实现永远在库中,程序内部只有地址,比较节省空间。

8.静态库VS动态库 :Linux默认使用的是动态链接和动态库


接下来讲解Linux项目自动化构建工具-make/Makefifile


会不会写makefifile,从一个侧面说明了一个人是否具备完成大型工程的能力

一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefifile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作

makefifile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

make是一个命令工具,是一个解释makefifile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefifile都成为了一种在工程方面的编译方法。

make是一条命令,makefifile是一个文件,两个搭配使用,完成项目自动化构建。

规则:makefile是一个围绕依赖关系和依赖方法构建的一个自动化编译的工具


依赖关系中:

目标文件对应的依赖文件列表可以是空


.PHONY:总是被执行的


比如:


a29d7e00d42847f2888a3671d05d58a3.png


在上图的makefile里,test依赖test.c.  而clean后面为空说明目标文件对应的依赖文件列表可以是空


makefile文件中,保存了编译器和链接器的参数选项,并且描述了所有源文件之间的关系。make程序会读取makefile文件中的数据,然后根据规则调用编译器,汇编器,链接器产生最后的输出。


makefile里主要包含了五个东西:显式规则,隐晦规则,变量定义,文件指示和注释

显式规则说明了如何生成一个或多个目标文件


make有自动推导的功能,所以隐晦的规则可以让我们比较粗糙的简略的书写makefile,比如源文件与目标文件之间的时间关系判断之类


在makefile中可以定义变量,当makefile被执行时,其中的变量都会被扩展到相应的引用位置上,通常使用$(var)表示引用变量


文件指示:包含在一个makefile中引用另一个makefile,类似C语言的include;

注释:makefile中可以使用#在行首表示行注释


默认情况下,make命令会在当前目录下按顺序找寻文件名为GNUmakefile,makefile,Makefile的文件,找到了解释这个文件


make的执行规则是,只生成所有目标对象的第一个,当然make会根据语法规则,递归生成第一个目标对象的所有依赖对象后再回头生成第一个目标对象,生成后退出


make在执行makefile规则中,根据语法规则,会分析目标对象与依赖对象的时间信息,判断是否在上一次生成后,源文件发生了修改,若发生了修改才需要重新生成


makefile中的伪对象表示对象名称并不代表真正的文件名,与实际存在的同名文件没有相互关系,因此伪对象不管同名目标文件是否存在都会执行对应的生成指令。伪对象的作用有两个。1.使目标对象无论如何都要重新生成。2.并不生成目标文件,而是为了执行一些指令。


makefile中使用.PHONY来声明伪对象


三、git的使用



如果没有Git就先安装git,命令为 yum install git


我这里使用的码云,首先在码云中新建一个仓库然后复制仓库的链接,然后再linux中输入命令


git clone + 仓库链接 : 就能将仓库克隆到本地了

204f18a0424f478284c6ea8116538c87.png


上图是我的仓库的路径,该怎么提交呢?首先将你要提交的文件拷贝到这个路径中


7f68ef7623464516ba8fe921acebd411.png


然后 git add . : .的意思是将当前目录下所有没有被添加的文件添加到仓库


接下来 git commit -m "此处是提交日志 "  : 提交日志必须好好写,这个可以查到


e6fa4b89a6f341b5a990a839d9cbff5e.png


然后git push即可,在这里会有一些问题,如果你是第一次提交则会出现git config --global user.email "you@example.com"和git config --global user.name "Your Name"这样的报错,这时候可以将其保存粘贴下来输入你自己的名字和邮箱运行即可。

a7b9aa149b0847f1b1b4b707682dbbd5.png

e1319b9ed1114b3588933ef223116c4b.png


这个时候代码就已经提交到远端仓库了。


git log :可以查看以往提交和删除的日志


git rm + 文件名 :在git中删除一个文件,删除后远端仓库也没有这个文件了


如果要在linux中把仓库删了只需要:rm .git -rf  即可


四、gdb的使用



程序的发布方式有两种,debug模式和release模式

Linux gcc/g++出来的二进制程序,默认是release模式

要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项

首先查看自己的系统是否有gdb这个软件,如果没有则使用命令:

yum install -y gdb   进行安装

在这里我们就直接使用makefile让其自动编译文件了,上面已经说过,要使用gdb调试,必须在源代码生成二进制程序的时候加上-g选项,所以我们的makefile如下图:

e3cc0cc0c1294d9aaeb667f36d809c13.png

后面的-std=c99是什么意思呢?因为我们在.c文件中使用了新的C语言语法特性linux默认的C语言标准是不支持这个特性的,所以我将其改为c99就可以正常编译了。

e52aef1ada3f4831999613639b29fda7.png


只有在c99的标准下才默认支持for循环内定义变量。


接下来我们讲解gdb的常用指令:


首先 gdb + 可执行文件  开始对文件的调试(注意是可执行文件而不是普通文件)


76e0e7784a4e46969261e6214a11a7dd.png


当出现如上图的提示的时候即可调试。


list / L   + 行号:显示文件的源代码,接着上次的位置往下列每次列10行


65a1d9c628e8478b9208698f3636cbce.png


L + 1   就是从第一行开始显示


list / L  + 函数名 :列出某个函数的源代码

abb3d7f04c8b45e6ba4d7e76e57bdf01.png


run / r :直接运行完整个程序


a237640d5b5c46969e715673d2159e61.png


break / b + 行数:在某行上打上断点


1413f6e705ad4258947e86b8e26c3c1e.png


如图在第五行打上了断点


info b/break  : 查看断点信息


此命令在上图中已有显示。


d + 断点编号  :删除某个断点


dd0ca35971bb42d59494e0b058e49234.png


d + breakpoints  :删除全部断点


3518219deff64e81a0f9339303338115.png


disable + breakpoint + 断点编号  :禁用某个断点


83a96be314f04daeb71ae88ae2367634.png


enable + breakpoint + 断点编号 : 打开某个断点


970cd75064e5418183c1189c36a3059a.png


quit 或者 ctrl + d  :  退出gdb

d9f7c7b999e64a399a25c544e97645c9.png


n/next  : 逐过程调试(遇见函数不进入函数)

8b475796ea7441ca8701d4408c577a94.png


在这里要说明一下gdb的每次run都会从距离main函数最近的那个断点开始,如果没有打断点run一下直接就程序运行完了也就无法调试,所以正确的步骤是先打断点,然后run,然后逐过程或者逐语句进行调试


s/step :   逐语句调试(遇见函数会进入函数)


58946d30ca1a4e0ea51854e40e00d649.png


p + 变量   :打印变量值


ef17646d034e46edb8c822b234c57aec.png


display + 变量  :  常显示变量


2ab5f247f03148adb30430948e7a2373.png


每一步调试都会自动把要常显示的变量打印一遍


undisplay + 常显示变量的编号  : 取消常显示


1a5b9e0c3be14ee4aabcc596a1083207.png


until + 行号   :在函数内,进行指定位置跳转,执行完区间代码


84c134dd0c034b05ab6cc46dc949e13b.png


finish : 进入一个函数,只执行完一个函数就停下来


acfe23ed2a94491fa657e8a76a358285.png


c : 从一个断点处直接运行到下一个断点处

e59729ed63ba4aa28e375e021634ca01.png


set var  : 修改变量的值

d9c6f835166b416293c7617a396b5c2e.png


以上就是在gdb中最常用的调试命令了。


总结



要掌握好linux这些环境基础开发工具是必须要会的,学会了这些再去写代码有着事半功倍的效果,在这些工具中,大多数指令是需要经常使用才能记住的,所以大家一定要多去练习这些指令,如果有能力的话还可以自己更深入的去研究,需要说明的是,虽然我们在文章中讲的git指令很少很简单,但实际只是让大家掌握了如何将代码提交到远程仓库,git还有很多功能是非常优秀的这就需要大家自己下去慢慢学习。


相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
目录
相关文章
|
2月前
|
Linux 开发工具 数据安全/隐私保护
linux异常一:feng 不在 sudoers 文件中,此事将被报告。yum提示Another app is currently holding the yum lock; waiting for
这篇文章介绍了在CentOS 7系统中安装Docker时遇到的两个常见问题及其解决方法:用户不在sudoers文件中导致权限不足,以及yum被锁定的问题。
48 2
linux异常一:feng 不在 sudoers 文件中,此事将被报告。yum提示Another app is currently holding the yum lock; waiting for
|
1月前
|
存储 缓存 Linux
【Linux】另一种基于rpm安装yum的方式
通过本文的方法,您可以在离线环境中使用RPM包安装YUM并进行必要的配置。这种方法适用于无法直接访问互联网的服务器或需要严格控制软件源的环境。通过配置本地YUM仓库,确保了软件包的安装和更新可以顺利进行。希望本文能够为您在特定环境中部署YUM提供实用的指导。
174 0
|
2月前
|
Linux 编译器 C语言
【Linux快速入门(一)】Linux与ROS学习之编译基础(gcc编译)
【Linux快速入门(一)】Linux与ROS学习之编译基础(gcc编译)
|
2月前
|
缓存 前端开发 Linux
Linux yum 命令
10月更文挑战第1天
59 2
|
3月前
|
关系型数据库 MySQL Linux
Linux 安装 mysql【使用yum源进行安装】
这篇文章介绍了在Linux系统中使用yum源安装MySQL数据库的步骤,包括配置yum源、安装MySQL服务、启动服务以及修改root用户的默认密码。
Linux 安装 mysql【使用yum源进行安装】
|
2月前
|
Unix Linux Go
Linux 使用Yum安装Go和配置环境
Linux 使用Yum安装Go和配置环境
|
24天前
|
NoSQL 编译器 C语言
C语言调试是开发中的重要技能,涵盖基本技巧如打印输出、断点调试和单步执行,以及使用GCC、GDB、Visual Studio和Eclipse CDT等工具。
C语言调试是开发中的重要技能,涵盖基本技巧如打印输出、断点调试和单步执行,以及使用GCC、GDB、Visual Studio和Eclipse CDT等工具。高级技巧包括内存检查、性能分析和符号调试。通过实践案例学习如何有效定位和解决问题,同时注意保持耐心、合理利用工具、记录过程并避免过度调试,以提高编程能力和开发效率。
40 1
|
4月前
|
NoSQL Linux C语言
Linux GDB 调试
Linux GDB 调试
68 10
|
4月前
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
145 3
|
4月前
|
NoSQL
技术分享:如何使用GDB调试不带调试信息的可执行程序
【8月更文挑战第27天】在软件开发和调试过程中,我们有时会遇到需要调试没有调试信息的可执行程序的情况。这可能是由于程序在编译时没有加入调试信息,或者调试信息被剥离了。然而,即使面对这样的挑战,GDB(GNU Debugger)仍然提供了一些方法和技术来帮助我们进行调试。以下将详细介绍如何使用GDB调试不带调试信息的可执行程序。
132 0