Linux中的开发工具(下)
目录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文件。
https://i-blog.csdnimg.cn/direct/7c89fef129e547719aec6065d8dd0d6a.png
https://i-blog.csdnimg.cn/direct/61f65964c5b74e5cb2d0e9fd133a33dc.png
⼀般我们这种clean的⽬标⽂件,我们将它设置为伪目标,用 .PHONY修饰,伪目标的特性是总是被实行。
解释:
看一个征象:
https://i-blog.csdnimg.cn/direct/84f284965ae540efbe40e4c891d89b95.png
我们加上 .PHONY修饰就可以连续实行了:
https://i-blog.csdnimg.cn/direct/3bb3a7a22d1c41bb8dfc893d4f7d2641.png
为什么加上.PHONY修饰就能连续实行?
由于 .PHONY修饰就是总是被实行生成目标文件。
https://i-blog.csdnimg.cn/direct/6f2410ce68e64e2c996f55c1eae037cf.png
而内容变了,往往属性就变了(大小变了,内容修改时间也变了),而属性变了内容不肯定变!
演示:
https://i-blog.csdnimg.cn/direct/678de24ca03d47aba78ce29ff6164291.png
https://i-blog.csdnimg.cn/direct/4f27a361fc204160b7ed86a920eda298.png
这个时间和 .PHONY 有什么关系呢?
加了.PHONY修饰就是总是被实行,没加就是总是不被实行,也就是说就是没加.PHONY导致了不能连续生成可实行文件。
原理:
https://i-blog.csdnimg.cn/direct/35dff0ae31734c30b7c9269df9b4aee8.png
这个时间就是它们的Modify时间,.PHONY的作用就是忽略源文件和可实行文件的时间对比。
我们知道touch有新建文件的意思,但还有刷新文件时间的意思,我们刷新一下,就可以连续生成可实行文件了。
继续看:
https://i-blog.csdnimg.cn/direct/84ed268ad78a49feb0275f91576b8442.png
但是我们一样寻常不如许写,我们一样寻常直接写一行就行,这只是推导。
扩展语法
https://i-blog.csdnimg.cn/direct/c1530474b8cc4f6b89c32399b91b5b24.png
我们每次写得时候,发现make一下,命令行都会回显,我们怎么样才能不回显?
加上@即可!
如果有多个源文件,makefile怎么写呢?
https://i-blog.csdnimg.cn/direct/d1efaf276f73408683b90cf452f591c0.png
https://i-blog.csdnimg.cn/direct/59d48350bf7f4242abfe951c2706056e.png
https://i-blog.csdnimg.cn/direct/0b58e8574f704722b50b446d9ebb7ab5.png
应用---进度条
缓冲区
我们知道\n是换行,而回车是\r(光标回到当前行的起始位置,而不扫除原始数据,如果新数据来到,只覆盖而已),换行回车\n\r。
我们键盘上的回车键实在就是我们这里的回车换行键。
我们简单用printf函数打印一下,发现\n就能立马打印,而如果不加\n,就会发现不会立马打印。
只是欠好观察。
我们可以借助sleep函数(秒)和usleep函数(微秒)观察!头文件:unistd.h
往显示器中打印时,首先辈入缓冲区,然后程序结束再将缓冲区中的数据写入到显示器,以是\r不能立马显示出来,而\n能,由于\n是换行了,\n是行刷新。
显示器实在是字符设备,它只认识字符,我们写入的任何数据,在它看来都是字符!
我们写一个简单的倒计时:
加深理解 \r 和缓冲区:
printf的底层实在就是fprintf函数。
https://i-blog.csdnimg.cn/direct/055960061c0847488b981cbf09dd5839.png
以是我们如许写:
https://i-blog.csdnimg.cn/direct/47c9c4d413314944977dce1004be5f26.png
我们来尝试写一个进度条:
#define NUM 101
#define STYLE '#'
void process_v1()
{
char buffer;
memset(buffer,0,sizeof(buffer));
const char* lable="|\/-\|";
int len=strlen(lable);
int cnt=0;
while(cnt<=100)
{
printf("[%-100s][%d%%][%c]\r",buffer,cnt,lable);
fflush(stdout);
buffer=STYLE;
usleep(50000);
}
printf("\n");
} 解释:
以起始和结尾着手分析更好,循环过程欠好分析,也不必要分析!
https://i-blog.csdnimg.cn/direct/b45b111b7fb54da09ab3975f2f5428bc.png
进阶---进度条:
我们在真正下载的时候,有一个下载多少mb,我们可以做一个非常拟合的进度条!
https://i-blog.csdnimg.cn/direct/1cef24f6206e411d9c6d97b8d3c1a979.png
代码:
double total=1024.0;
double speed=1.0;
void Download()
{
int current=0;
while(current<=total)
{
process_v2(total,current);
current+=speed;
usleep(3000);
}
printf("\ndownload %.2f Done!\n",total);
} #define NUM 101
#define STYLE '#'
void process_v2(double total,double current)
{
char buffer;
memset(buffer,0,sizeof(buffer));
const char* lable="|-\|/";
int len=strlen(lable);
int num=(int)(current*100/total);
int i=0;
for(i=0;i<num;i++)
{
buffer=STYLE;
}
static int cnt=0;
printf("[%-100s][%d%%][%c]\r",buffer,num,lable);
cnt%=len;
fflush(stdout);
}
git的使用
我们以gitee为例。
安装git
yum install git 创建项目
https://i-blog.csdnimg.cn/direct/e0e57df676f14b32bd3092bd580f07b9.png
使用
.git文件是隐藏的本地仓库,存放着全部的修改记载。
克隆
我们使用必要先将远程仓库克隆到本地:
https://i-blog.csdnimg.cn/direct/d6f4ba9d49064e7b9752c506e1849fdb.png
git clone [刚刚复制的链接] 注意:第一次提价必要gitee的用户名和密码!
https://i-blog.csdnimg.cn/direct/cf75080264b74dcda3365e46bbd3f7c2.png
https://i-blog.csdnimg.cn/direct/a1e96fe9e22b40beaec2621b46f47279.png
提交到暂存区
git add [路径文件] https://i-blog.csdnimg.cn/direct/64f4edc526d846c595155219d77291c8.png
提交到本地仓库
git commit -m "......" 注意:双引号中必须要填写内容。
但是我们commit必须要告诉git我们是以什么身份(什么名字),提交记载的,以便后续能找到是谁提交的这个代码!
https://i-blog.csdnimg.cn/direct/5b93e74a807149219f89790d09ac0940.png
我们可以试试这两句代码来告诉我们是谁:
git config --global user.email "you@example.com" (你的gitee邮箱地址)
git config --global user.name "Your Name"
验证是否成功:
https://i-blog.csdnimg.cn/direct/5f2a6b30817e4e36b2ace10ff935b1d1.png
注意:邮箱地点最后和gitee邮箱地点一样,名字可以不一样!
然后再commit一下,继续输入你的gitee用户名和密码即可,即可提交本地仓库成功!
这两句代码就是全局设置。运行完之后,家目录下主动会有.gitconfig文件(~/.gitconfig)
打开我们看到:
https://i-blog.csdnimg.cn/direct/76711435f3174b8c9e56223aa44afcdf.png
仓库设置:
git configuser.email "you@example.com" (你的gitee邮箱地址)
git configuser.name "Your Name"
我们来介绍两种设置的方法:(重点全局设置)
仓库设置:仅对当前仓库起效(只有当前仓库不必要密码!)
只必要设置仓库目录下的 .git/config 文件。
https://i-blog.csdnimg.cn/direct/ef41d33df6b74f6a8462e920db2032b2.png
全局设置:对当前用户的全部仓库都起效!
只必要设置家目录下的.gitconfig文件。
我们重要介绍全局设置(提交到远程仓库也是讲全局设置)。
提交到远程仓库
提交必要gitee用户名和密码,我们可以设置免密码提交。
在家目录下,创建.git-credentials文件。
https://i-blog.csdnimg.cn/direct/772cbea9e9e9423d8b4b4c9a5300c526.png
打开.git-credentials文件,输入:
https://{username}:{passward}@gitee.com
https://i-blog.csdnimg.cn/direct/28e53251e5c449bfa122599d80d6f05f.png
然后再实行命令:
git config --global credential.helper store 就会发现.gitconfig文件多了内容:
https://i-blog.csdnimg.cn/direct/e19355b52c6f4e46893b15ed125eee32.png
再重新实行push命令,即可成功!
https://i-blog.csdnimg.cn/direct/c85d521e457d43b08b2a1faf69774ea5.png
指令:
git status:查看当前提交状态
git log:查看提交日志
总结:
当本地仓库和远程仓库内容不统一时,我们去提交,就会辩说,以是我们必要git pull 实行一下,将
本地仓库更新一下,保证远程仓库和本地仓库一致!
固然我们可以多次add和commit到本地仓库,最后一起提交到远程仓库!
https://i-blog.csdnimg.cn/direct/f0d9ccdf64f1493c9e8d205c5673aedf.png
gdb/cgdb
我们写了代码,肯定时不时的会发生错误,以是我们必要调试器----gdb/cgdb
下载:
yum install -y gdb
yum install -y cgdb 我们可以使用gdb,也能使用cgdb,一样寻常使用cgdb,由于gdb在我们调试的时候,我们并不能看到我们的代码,比较难用,而cgdb能!
图:
https://i-blog.csdnimg.cn/direct/a7d79f8a62c642028bf5d02c7681de45.png
https://i-blog.csdnimg.cn/direct/a5a1454891ca4d5396e1711811f132b0.png
一下我们都使用cgdb作为演示!
使用
预备
我们知道程序的发行有两种:debug模式和release模式,而Linux gcc/g++出来的二进制程序,默认时release模式。
注意:只有在debug模式下形成的可实行文件才能调试!
以是我们在形成可实行文件指令时,必要加上-g指令。
如:
gcc/g++ dst.c -o src -g 注意:gdb/cgdb 后面接形成后的可实行文件!而不是接源文件!
如:
gdb/cgdb src 实操
基本指令:
退出:ctrl+d 或 q 或 quit。
l +行号:显示源代码,每次列出10行,枚举出来后,再按一次回车,可以看到全部代码。
如:
https://i-blog.csdnimg.cn/direct/ec72eb397f214510b9673a8e56ae9106.png
光标切屏:i 和 ESc 按键。
解释:
https://i-blog.csdnimg.cn/direct/1dadb66b84c4427896f04b339fdd1025.png
b 行数或 b dst.c:行数 :在某一行打断点。
https://i-blog.csdnimg.cn/direct/5872d12fc2e84f06ac677e605099731d.png
info b:查看断点信息。
https://i-blog.csdnimg.cn/direct/4e75a8dbf9b84ba0bbb616e91c26ac53.png
disable 断点编号:禁用此断点。
enable 断点编号:启用此段点。
https://i-blog.csdnimg.cn/direct/9635d5f085ef42a18dd7c08e5bc22700.png
d 断点编号:删除此断点。
https://i-blog.csdnimg.cn/direct/a9e81a321242485fa765d2d362bf1059.png
https://i-blog.csdnimg.cn/direct/5a722d29dc22446cbc8692eae948c6b3.png
b 函数名:在函数开头打断点,相当于在这个函数的第一行打了断点。
r:程序开始跑起来,跳到第一个断点处。当在调试中,想重新开始一遍,也可以按下 r ,回到第一个断点处。
n:(next)代表逐过程,相当于 vs 2022中的F10按钮。比如可以跳过函数。
https://i-blog.csdnimg.cn/direct/7c365c8c65354533afc2ed9d1bb049bd.png
s:(step)代表逐语句,相当于vs2022中的F11按钮。
https://i-blog.csdnimg.cn/direct/491a01b4fce94ee9b37cd476cd488523.png
如果想跳过一个循环呢?逐过程和逐语句都跳不外循环。
until:实行到函数中,可直接跳出循环。
until 行数:实行到指定行。
https://i-blog.csdnimg.cn/direct/6927df24f39446f5b2e8e57f434ff37b.png
c:(continue)实行到下一个断点。
https://i-blog.csdnimg.cn/direct/9806a781738641c891c69c8fe0f3fa73.png
finish:直接跳出函数。
https://i-blog.csdnimg.cn/direct/c5e097eeb8554b9eb83b608361d19e54.png
p 变量名:(print)查看变量名内容。
info locals:看当前函数的全部临时变量内容。
https://i-blog.csdnimg.cn/direct/abd9334cc52543e7818e3521cab322e6.png
https://i-blog.csdnimg.cn/direct/8ce7a5ce565846c3b95a02060bdbeab4.png
watch 变量名:执⾏时监视⼀个表达式(如变量)的值。如果监视的表达式在程序运⾏期间的值发⽣变革,GDB会暂 停程序的执⾏,并关照使⽤者。
https://i-blog.csdnimg.cn/direct/af8a72210512464db1b2fbc48e0bfb73.png
https://i-blog.csdnimg.cn/direct/311cf19cc41c4b92802e882b5c301f42.png
set var 表达式:临时修改变量值,一样寻常用来确定标题缘故起因。
https://i-blog.csdnimg.cn/direct/517aeeb1f7df473f8cb869cdb19994cf.png
条件断点
b 行号 if 变量名==值:只有i等于某个值时,才触发这个断点,且只触发一次。
condition 断点编号 变量名==值:给某个断点新增条件。
这里不外多展示。
反汇编:
objdump -S src > src.s 将可实行文件反汇编成.s文件。
https://i-blog.csdnimg.cn/direct/53de28f4f38b4ea7b1392eceba13f967.png
好了,我们下期见。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]