哈喽大家好,我是 鹿九丸 \color{red}{鹿九丸} 鹿九丸,今天给大家带来的是Linux环境基础开发工具使用(下)。
如果大家在看我的博客的过程中或者学习的过程中以及在学习方向上有什么问题或者想跟我交流的话可以加我的企鹅号: 2361038962 \color{red}{2361038962} 2361038962,或者寄邮件到相应的邮箱里: 2361038962 @ q q . c o m \color{red}{2361038962@qq.com} 2361038962@qq.com,我会尽量帮大家进行解答!
程序的发布方式有两种,debug模式和release模式
Linux gcc/g++出来的二进制程序,默认是release模式
要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项
例如:
gcc hello.c -o hello -g
,此时形成的hello中就包含着各种调试信息,通过下面的命令可以对调试信息进行查看:
readelf -S hello
注意:使用C99的标准通过gcc对程序进行编译:
gcc hello.c -o hello -std=c99
gdb binFile
退出: ctrl + d
或 quit
调试命令:
list/l 行号:显示binFile源代码,从行号位置处开始显示,按回车之后接着上次的位置往下列,每次列10行。
例如:l 0
:从第0行开始显示,l main
:显示main函数的代码list/l 函数名:列出某个函数的源代码。
r或run:运行程序。
n 或 next:单条执行即逐过程进行执行。
s或step:进入函数调用,或者逐语句逐语句进行执行
break(b) 行号:在某一行设置断点
break 函数名:在某个函数开头设置断点
info break/info b :查看断点信息。
finish:执行到当前函数返回,然后挺下来等待命令
print§:打印表达式的值,通过表达式可以修改变量的值或者调用函数
p 变量:打印变量值。
set var:修改变量的值
continue(或c):从当前位置开始连续而非单步执行程序,即从一个断点跳转到另一个断点的位置处
run(或r):从开始连续而非单步执行程序
delete breakpoints:删除所有断点
delete breakpoints n:删除序号为n的断点
d 断点序号
删除相应的断点。disable breakpoints:禁用断点
enable breakpoints:启用断点
info(或i) breakpoints(b):参看当前设置了哪些断点
例如:
info b
查看当前设置了哪些断点display 变量名:跟踪查看一个变量,每次停下来都显示它的值
undisplay 变量序号:取消对先前设置的那些变量的跟踪
until X行号:跳至X行
breaktrace(或bt):查看各级函数调用及参数
info(i) locals:查看当前栈帧局部变量的值
quit:退出gdb
bt:查看调用的堆栈
- 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力
- 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的 规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂 的功能操作
- makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编 译,极大的提高了软件开发的效率。
- make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命 令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一 种在工程方面的编译方法。
- make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。
makefile/Makefile:在当前路径下的一个普通文件。包含:
- 依赖关系
- 依赖方法
举例:
现有一个源文件,hello.c
依赖关系:
hello.c -> hello
clean
依赖方法:
gcc hello.c -o hello
rm -rf hello
Makefile图示:
使用方法:
make
:执行gcc hello.c -o hello
make clean
:执行rm -rf hello
问:为什么每次使用make指令只执行
gcc hello.c -o hello
?答:因为它写在makefile的前面。默认只会形成第一个目标文件,执行该依赖关系的依赖方法。
.PHONY
:Makefile语法格式中的一个关键字,伪目标,被.PHONY修饰的标签总是被执行的。问:总是被执行是什么意思?
答:
我们可以看到当我们第二次第三次执行make指令时会显示Test可执行文件已经是最新形成的可执行程序了。
假如我们用
.PHONY
来修饰hello
问:makefile是怎么识别我的exe/bin是新的还是旧的呢?
答:
文件 = 内容 + 属性
Access:读取或者进入的时间。
Modify:内容发生改变。
Change:属性发生改变。(例如:权限)
注意:属性的改变并非真正发生了改变,比如文件hello.c已经拥有了r权限,我们再执行指令
chmod u+r
这也算对权限进行改变。我们使用vim hello.c
之后,hello.c
的Modify时间就会发生改变。注意:内容的改变必然会引起Change也会发生改变,因为内容的改变往往会改变文件的大小,而文件的大小属于文件的属性。
注意:有时候打开文件并不一定会引起Access时间的改变。只有当累计到一定次数之后才会发生改变。
从上图可以看出:对比hello.c的时间和hello即可得知hello是否改变过,即根据对比源文件和可执行程序的最近修改时间,评估要不要重新生成。
问:如果我们有多个源文件,我们该如何使用makefile对文件进行编译呢?
答:以下面的例子为例:
test.c
文件:
test.h
文件:
main.c
文件:
makefile
文件:
回车概念(\r):将光标回到当前行的最开始。如图所示:
换行概念:从一行的某个位置换到下一行的同一个位置,新起一行。如图所示:
我们通常所使用的换行或者键盘中的回车,其实是回车+换行。
下面有两段程序:
程序一:
程序二:
编译运行后,两段程序出现了不一样的现象:
程序一:先输出了
hello world
,然后在当前屏幕下停顿了2秒,然后程序退出。程序二:先停顿了2秒,然后打印出了
hello world
,然后程序退出。
问:在程序二停顿2s的这段时间,
hello world
这些字符在哪呢?答:是存在与缓冲区中。我们可以理解为是在一段内存空间中,一般的刷新策略为行刷新,即满一行即刷新,我们常用的
\n
的意思就是包括\n
和之前的字符形成一行,此时满足了刷新策略,即刻对缓冲区中的字符进行输出。当然,我们也可以使用
fflush()
函数强制对缓冲区进行刷新。
进度条代码:
git是一个版本控制器。
sudo yum install -y git
git clone Http网址
git status
git add 文件名或者文件夹名 //*是当前目录下的所有文件 .是当前目录下未提交的文件
git commit -m "" //添加已经被修改的文件到本地的仓库,”“内的是提交日志,-m选项就是为了提交提交日志
git push
git pull //将远端的代码拉取到本地来
git log //查看提交日志
问:.gitignore是什么意思?
答:是黑名单,在这个名单中的后缀将不会被提交到gitee/github上。