Linux之基础开发工具(下)

简介: Linux之基础开发工具(下)

5.Linux下库的命名

去掉前缀lib,去掉后缀.so 剩下的就是库名称。动态库的后缀是.so 静态库的后缀是.s

eg: libC.so =》 C标准库

1.动态库

libXXXX.so

  1. 一般而言,系统会自带动态库(为什么?
    因为系统的运行需要用到动态库。
  2. 敢不敢删除系统中的C动态库?
    不敢。用C动态库的程序非常多,库只有一份,所有用C语言编写的程序不会出现重复的库代码! =》 将动态库又称为共享库。
    如果我们下载了一个用C编写的程序,还需要额外下载C标准库吗?不需要,它会自带。

2.静态库

libYYYY.a

  1. 静态库如果不存在,则需要自己安装(如果要生成静态链接,需要自己安装C/C++静态库)。 如果系统中只存在静态库,则默认的链接就是静态链接
  2. 敢不敢删除系统中的C动态库?
    原因同动态库。

6.总结

系统本身为了支持我们编程,给我们的程序提供了什么呢?

系统给我们提供的标准库.h(告诉我们怎么用),标准的动静态库.so/.a(告诉我们,方法实现我有,有需要就来找我)。

我的代码 + 库的代码 = 可执行程序。

上面的内容只在Linux下有效吗?windows下原理是一样的。(windows中静态库.dll,静态库.lib)同时windows下默认的默认链接也是动态链接。

四、makefile(自动化构建工具)

makefile是一个文件,make是一个命令(执行makefile中的命令)。

1.makefile原理

makefile存在的意义,是为了构建项目(做的一件事情),做一件事情需要:a.依赖关系,b.依赖方法

依赖关系,用哪个源文件生成目标文件;

依赖方法,如何用源文件生成目标文件。

例子:你去向你爸要生活费,会说爸,给我点生活费。

依赖关系:你和你爸是父子关系;

依赖方法:你爸给你打钱。

因此,makefile内部要保存大量的依赖关系和依赖方法。

例子:

第一行是依赖关系(mytest文件的形成依赖mytest.c文件),第二行是依赖方法(mytest.c文件经过编译形成mytest文件)

注意:第二行的最开始空白是一个Tab而不是几个空格。

2.makefile的语法

make会执行第一个目标文件的生成语句

make 目标文件文件名 会执行指定的文件语句。

3.如何确保为目标文件每次是否需要重新编译生成?

根据目标文件和它依赖的文件的修改时间差(关于时间的具体内容参见下文):如果它所依赖的文件修改时间在目标文件修改时间之前,则不需要再进行重新生成目标文件;如果它所依赖的文件修改时间在目标文件修改时间之后,则需要再重新生成目标文件。

一旦目标文件被设置为伪目标文件,即用.PHONY:进行修饰,则目标文件每一次都将无视修改时间,即必须重新生成。

4.makefile的推导规则

如果要将上面例子的每个步骤都进行执行的话,则需要如下图的代码:

make在缺省情况下(不指定目标文件),会只执行第一个目标文件的代码。如果第一个目标文件所依赖的文件还没有生成,就会去生成所依赖的文件(这一过程类似栈的规则:先进后出)。

五、gdb(调试器)

1.背景知识

  1. 程序的发布方式有两种:debug版本和release版本。

debug版本方便程序员对程序进行调试,而release版本将很多可以调试的地方优化了(例如:assert会在release版本下失效)。

release的大小也比debug大。

  1. Linux gcc/g++出来的二进制程序默认是以release版本发布的。
  2. 为了能对程序进行调试,我们要将程序以debug版本进行发布,需要在源代码生成二进制程序的时候加上-g选项。

2. 使用(指令)

1.安装

sudo yum install -y gdb

2.发布debug版本的文件

gcc -g test.c -o test_g

默认情况下gdb无法对当前发布的版本(默认为release版本)进行调试,要发布debug版本才行。

3.相关的调试指令

发布debug版本的文件,使用调试指令进行调试。

list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。

list/l 函数名:列出某个函数的源代码。

r或run:运行程序。

n 或 next:单条执行。

s或step:进入函数调用

break(b) 行号:在某一行设置断点

break 函数名:在某个函数开头设置断点

info break :查看断点信息。

finish:执行到当前函数返回,然后挺下来等待命令

print§:打印表达式的值,通过表达式可以修改变量的值或者调用函数

p 变量:打印变量值。

set var:修改变量的值

continue(或c):从当前位置开始连续而非单步执行程序

run(或r):从开始连续而非单步执行程序

delete breakpoints:删除所有断点

delete breakpoints n:删除序号为n的断点

disable breakpoints:禁用断点

enable breakpoints:启用断点

info(或i) breakpoints:参看当前设置了哪些断点

display 变量名:跟踪查看一个变量,每次停下来都显示它的值

undisplay:取消对先前设置的那些变量的跟踪

until X行号:跳至X行

breaktrace(或bt):查看各级函数调用及参数

info(i) locals:查看当前栈帧局部变量的值

quit:退出gdb

4.部分调试指令的演示

注意:gdb中如果本次没有输入指令,则默认同上一次的指令相同,直接进行执行(直接enter)。

  1. l
    显示代码(list的简称,l 0从第一行开始显示,继续enter会继续显示剩余的代码)
  2. b
    打断点(b 是break的简称,即break后跟要打断点的代码行即可)
  3. info b
    查看断点
  4. d +断点编号
    取消断点
  5. r
    调试运行,到第一个断点处停下(run的简称)
  6. n
    逐过程调试(next的简称,该调试方式不进入函数)
  7. s
    逐语句调试(step的简称,该调试方式进入函数)
  8. bt
    显示函数调用堆栈
  9. fin
    直接将函数运行完(finish的简称)
  10. display
    常显示变量(类似于vs2013中的监视)
    test.c的代码:
    调试现象:

六、Linux中文件的三个时间

1.access

被访问的时间,原本的规则是每次访问时间都会被改变,但是由于一旦文件被修改,就意味着它被访问了,而它被访问了却不一定被需修改,为了避免修改频率太快,导致资源浪费(访问时间用处也不大),因此是在一段时间里,多次访问才会更新时间。(不一定是最新时间)

2.modify

文件内容的修改时间(最新时间)

3.change

文件属性的修改时间(最新时间),文件内容发生变化会导致文件属性发生修改,文件属性包括文件内容。

七、简单写一个倒计时

1.缓冲区问题

看看如下代码

先sleep还是先printf?

根据程序运行的顺序,先printf再sleep。

但是,通过运行我们发现是先sleep了,之后才打印出来了。

说明是先将内容放在缓冲区,sleep后再将缓冲区内容显示在屏幕上。

但是,如果在printf中增加\n,则会及时的显示内容。

因此,我们明白printf的内容是先存放在缓冲区里,等到缓冲区刷新时才会显示到显示器上。

2.回车换行

一般而言:

\r换行是指换到下一行

\n回车指回到当前行的最开始

但是在语言层面

\n就是回车换行

3.显示器为什么能显示各种符号?

显示器面板上有各种像素点,凡是显示到显示器上的都是字符(显示器不认识字符的含义,只是根据用户的要求进行显示一个一个的字符)

4.倒计时代码

代码如下,大家可以自行运行尝试。

注意:

  1. 用\r回到当前行的最开始,用新的值覆盖旧的值就能实现动态倒计时的效果;
  2. 因为\r不会主动刷新缓冲区,导致缓冲区的内容无法显示在显示器上,因此每一次都要用fflush函数对缓冲区进行刷新;
  3. 因为cnt从两位数变为一位数的,因此我们为了将它最初的两位数都可以进行覆盖,要对打印的格式进行控制。

八、Linux下的第一个小程序——进度条

如果需要源码,可以参考该网址(我的gitee):

实现一个进度条源代码


总结

以上就是今天要讲的内容,本文介绍了Linux中的基础开发工具的相关知识。本文作者目前也是正在学习Linux相关的知识,如果文章中的内容有错误或者不严谨的部分,欢迎大家在评论区指出,也欢迎大家在评论区提问、交流。

最后,如果本篇文章对你有所启发的话,希望可以多多支持作者,谢谢大家!

相关文章
|
6月前
|
NoSQL Linux 测试技术
Linux开发工具——gdb篇
Linux开发工具——gdb篇
|
6月前
|
存储 Linux 开发工具
Linux开发工具——gcc篇
Linux开发工具——gcc篇
|
6月前
|
小程序 Linux 开发工具
【Linux】Linux 开发工具(vim、gcc/g++、make/Makefile)+【小程序:进度条】-- 详解
【Linux】Linux 开发工具(vim、gcc/g++、make/Makefile)+【小程序:进度条】-- 详解
|
5月前
|
Linux 开发工具 数据安全/隐私保护
Linux基础——Linux开发工具(下)_make/makefile
Linux基础——Linux开发工具(下)_make/makefile
45 1
|
4月前
|
NoSQL Linux 开发工具
【linux】在linux操作系统下快速熟悉开发环境并上手开发工具——体验不一样的开发之旅
【linux】在linux操作系统下快速熟悉开发环境并上手开发工具——体验不一样的开发之旅
|
5月前
|
NoSQL Linux 开发工具
【Linux】Linux环境基础开发工具_6
【Linux】Linux环境基础开发工具_6
37 0
|
5月前
|
小程序 Linux 开发工具
【Linux】Linux环境基础开发工具_5
【Linux】Linux环境基础开发工具_5
27 0
|
5月前
|
小程序 Linux 开发工具
【Linux】Linux环境基础开发工具_4
【Linux】Linux环境基础开发工具_4
34 0
|
5月前
|
Linux 开发工具 C语言
【Linux】Linux环境基础开发工具_3
【Linux】Linux环境基础开发工具_3
21 0
|
5月前
|
Linux Shell 开发工具
【Linux】Linux环境基础开发工具_2
【Linux】Linux环境基础开发工具_2
17 0