Linux中的开发工具(下)

打印 上一主题 下一主题

主题 1677|帖子 1677|积分 5031

目录
make/makefile
扩展语法
应用---进度条
缓冲区
git的使用
安装git
创建项目
使用
克隆
提交到暂存区
提交到本地仓库
提交到远程仓库
gdb/cgdb
使用
预备
实操
条件断点


make/makefile



  • 会不会写makefile,从⼀个侧⾯阐明白⼀个⼈是否具备完成⼤型⼯程的能⼒
  • ⼀个⼯程中的源⽂件不计数,其按范例、功能、模块分别放在若⼲个⽬录中,makefile界说了⼀ 系列的规则来指定,哪些⽂件必要先编译,哪些⽂件必要后编译,哪些⽂件必要重新编译,甚⾄ 于进⾏更复杂的功能操作
  • makefile带来的利益就是⸺“⾃动化编译”,⼀旦写好,只必要⼀个make命令,整个⼯程完全 ⾃动编译,极⼤的提⾼了软件开发的效率。
  • make是⼀个命令⼯具,是⼀个解释makefile中指令的命令⼯具,⼀般来说,⼤多数的IDE都有这 个命令,⽐如:Delphi的make,VisualC++的nmake,Linux下GNU的make。可⻅,makefile 都成为了⼀种在⼯程⽅⾯的编译⽅法。
  • make是⼀条命令,makefile是⼀个⽂件,两个搭配使⽤,完成项⽬⾃动化构建。
基本用法:
当我们写了多个源代码,为了方便,我们可以新建一个makefile文件。


⼀般我们这种clean的⽬标⽂件,我们将它设置为伪目标,用 .PHONY修饰,伪目标的特性是总是被实行。
解释:
看一个征象:

我们加上 .PHONY修饰就可以连续实行了:

为什么加上.PHONY修饰就能连续实行?
由于 .PHONY修饰就是总是被实行生成目标文件。

而内容变了,往往属性就变了(大小变了,内容修改时间也变了),而属性变了内容不肯定变!
演示:


这个时间和 .PHONY 有什么关系呢?
加了.PHONY修饰就是总是被实行,没加就是总是不被实行,也就是说就是没加.PHONY导致了不能连续生成可实行文件。
原理:

这个时间就是它们的Modify时间,.PHONY的作用就是忽略源文件和可实行文件的时间对比。
我们知道touch有新建文件的意思,但还有刷新文件时间的意思,我们刷新一下,就可以连续生成可实行文件了。
继续看:

但是我们一样寻常不如许写,我们一样寻常直接写一行就行,这只是推导。
扩展语法


我们每次写得时候,发现make一下,命令行都会回显,我们怎么样才能不回显?
加上@即可!
如果有多个源文件,makefile怎么写呢?



应用---进度条

缓冲区

我们知道\n是换行,而回车是\r(光标回到当前行的起始位置,而不扫除原始数据,如果新数据来到,只覆盖而已),换行回车\n\r。
我们键盘上的回车键实在就是我们这里的回车换行键。
我们简单用printf函数打印一下,发现\n就能立马打印,而如果不加\n,就会发现不会立马打印。
只是欠好观察。
我们可以借助sleep函数(秒)和usleep函数(微秒)观察!头文件:unistd.h
往显示器中打印时,首先辈入缓冲区,然后程序结束再将缓冲区中的数据写入到显示器,以是\r不能立马显示出来,而\n能,由于\n是换行了,\n是行刷新。
显示器实在是字符设备,它只认识字符,我们写入的任何数据,在它看来都是字符!
我们写一个简单的倒计时:
加深理解 \r 和缓冲区:
printf的底层实在就是fprintf函数。

以是我们如许写:

我们来尝试写一个进度条:
  1.   #define NUM 101   
  2.   #define STYLE '#'   
  3.   void process_v1()   
  4.   {   
  5.     char buffer[NUM];   
  6.     memset(buffer,0,sizeof(buffer));   
  7.     const char* lable="|\/-\|";                                                                                                            
  8.     int len=strlen(lable);   
  9.     int cnt=0;   
  10.     while(cnt<=100)   
  11.     {   
  12.       printf("[%-100s][%d%%][%c]\r",buffer,cnt,lable[cnt%len]);   
  13.       fflush(stdout);   
  14.       buffer[cnt++]=STYLE;   
  15.       usleep(50000);   
  16.     }   
  17.     printf("\n");   
  18. }
复制代码
解释:
以起始和结尾着手分析更好,循环过程欠好分析,也不必要分析!

进阶---进度条:
我们在真正下载的时候,有一个下载多少mb,我们可以做一个非常拟合的进度条!

代码:
  1. double total=1024.0;   
  2. double speed=1.0;   
  3.    
  4. void Download()   
  5. {   
  6.   int current=0;   
  7.   while(current<=total)   
  8.   {   
  9.     process_v2(total,current);   
  10.     current+=speed;   
  11.     usleep(3000);                                                                                                                           
  12.   }   
  13.   printf("\ndownload %.2f Done!\n",total);   
  14. }
复制代码
  1.   #define NUM 101   
  2.   #define STYLE '#'   
  3.       
  4.   void process_v2(double total,double current)   
  5.   {   
  6.     char buffer[NUM];   
  7.     memset(buffer,0,sizeof(buffer));   
  8.     const char* lable="|-\|/";   
  9.     int len=strlen(lable);   
  10.       
  11.     int num=(int)(current*100/total);   
  12.     int i=0;   
  13.     for(i=0;i<num;i++)   
  14.     {   
  15.       buffer[i]=STYLE;   
  16.     }   
  17.     static int cnt=0;                                                                                                                       
  18.     printf("[%-100s][%d%%][%c]\r",buffer,num,lable[cnt++]);   
  19.     cnt%=len;   
  20.     fflush(stdout);   
  21.   }   
复制代码
git的使用

我们以gitee为例。
安装git

  1. yum install git
复制代码
创建项目


使用

.git文件是隐藏的本地仓库,存放着全部的修改记载。
克隆

我们使用必要先将远程仓库克隆到本地:

  1. git clone [刚刚复制的链接]
复制代码
注意:第一次提价必要gitee的用户名和密码!


提交到暂存区

  1. git add [路径文件]
复制代码

提交到本地仓库

  1. git commit -m "......"
复制代码
注意:双引号中必须要填写内容。
但是我们commit必须要告诉git我们是以什么身份(什么名字),提交记载的,以便后续能找到是谁提交的这个代码!

我们可以试试这两句代码来告诉我们是谁:
  1. git config --global user.email "you@example.com" (你的gitee邮箱地址)
  2. git config --global user.name "Your Name"
复制代码
验证是否成功:

注意:邮箱地点最后和gitee邮箱地点一样,名字可以不一样!
然后再commit一下,继续输入你的gitee用户名和密码即可,即可提交本地仓库成功!
这两句代码就是全局设置。运行完之后,家目录下主动会有.gitconfig文件(~/.gitconfig)
打开我们看到:

仓库设置:
  1. git config  user.email "you@example.com" (你的gitee邮箱地址)
  2. git config  user.name "Your Name"
复制代码
我们来介绍两种设置的方法:(重点全局设置)
仓库设置:仅对当前仓库起效(只有当前仓库不必要密码!)
只必要设置仓库目录下的 .git/config 文件。

全局设置:对当前用户的全部仓库都起效!
只必要设置家目录下的.gitconfig文件。
我们重要介绍全局设置(提交到远程仓库也是讲全局设置)。
提交到远程仓库

提交必要gitee用户名和密码,我们可以设置免密码提交。
在家目录下,创建.git-credentials文件。

打开.git-credentials文件,输入:
  1. https://{username}:{passward}@gitee.com
复制代码

然后再实行命令:
  1. git config --global credential.helper store
复制代码
就会发现.gitconfig文件多了内容:

再重新实行push命令,即可成功!

指令:
git  status:查看当前提交状态
git log:查看提交日志
总结:
当本地仓库和远程仓库内容不统一时,我们去提交,就会辩说,以是我们必要git  pull  实行一下,将
本地仓库更新一下,保证远程仓库和本地仓库一致!
固然我们可以多次add和commit到本地仓库,最后一起提交到远程仓库!

gdb/cgdb

我们写了代码,肯定时不时的会发生错误,以是我们必要调试器----gdb/cgdb
下载:
  1. yum install -y gdb
  2. yum install -y cgdb
复制代码
我们可以使用gdb,也能使用cgdb,一样寻常使用cgdb,由于gdb在我们调试的时候,我们并不能看到我们的代码,比较难用,而cgdb能!
图:


一下我们都使用cgdb作为演示!
使用

预备

我们知道程序的发行有两种:debug模式和release模式,而Linux gcc/g++出来的二进制程序,默认时release模式。
注意:只有在debug模式下形成的可实行文件才能调试!
以是我们在形成可实行文件指令时,必要加上-g指令。
如:
  1. gcc/g++ dst.c -o src -g
复制代码
注意:gdb/cgdb 后面接形成后的可实行文件!而不是接源文件!
如:
  1. gdb/cgdb src
复制代码
实操

基本指令:
退出:ctrl+d 或 q 或 quit。
l +行号:显示源代码,每次列出10行,枚举出来后,再按一次回车,可以看到全部代码。
如:

光标切屏:i 和 ESc 按键。
解释:

b 行数或 b dst.c:行数 :在某一行打断点。 

info b:查看断点信息。

disable 断点编号:禁用此断点。
enable 断点编号:启用此段点。

d 断点编号:删除此断点。


b 函数名:在函数开头打断点,相当于在这个函数的第一行打了断点。
r:程序开始跑起来,跳到第一个断点处。当在调试中,想重新开始一遍,也可以按下 r ,回到第一个断点处。
n:(next)代表逐过程,相当于 vs 2022中的F10按钮。比如可以跳过函数。

s:(step)代表逐语句,相当于vs2022中的F11按钮。

如果想跳过一个循环呢?逐过程和逐语句都跳不外循环。
until:实行到函数中,可直接跳出循环。
until 行数:实行到指定行。

c:(continue)实行到下一个断点。

finish:直接跳出函数。

p 变量名:(print)查看变量名内容。
info locals:看当前函数的全部临时变量内容。


watch 变量名:执⾏时监视⼀个表达式(如变量)的值。如果监视的表达式在程序运⾏期间的值发⽣变革,GDB会暂 停程序的执⾏,并关照使⽤者。


set var 表达式:临时修改变量值,一样寻常用来确定标题缘故起因。

条件断点

b 行号 if  变量名==值:只有i等于某个值时,才触发这个断点,且只触发一次。
condition 断点编号 变量名==值:给某个断点新增条件。
这里不外多展示。
反汇编:
  1. objdump -S src > src.s
复制代码
将可实行文件反汇编成.s文件。

好了,我们下期见。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

万万哇

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表