大家好,我是旗帜僵尸,今天想吃点🧠。现在我将带大家学习linux中基本工具gcc/g++,make,makefile与gdb的知识。
本篇文章将继续收录于我的linux专栏中,若想查看关于linux其它知识的文章也可以点击右方链接。旗帜僵尸——linux
文章目录
gcc/g++(酸🧠)初步认识对于代码编译的认识对于链接的认识gcc/g++的使用 make与makefile(辣🧠)基本使用 gdb(苦🧠)初步认识gdb使用 总结gcc/g++(酸🧠)
初步认识
在windows种,往往我们只需要下载一个编译器,那么我们既可以在里面编写代码,又可以编译运行它。
而在linux中,vim用来编写代码。
gcc用来编译我们的代码。
对于代码编译的认识
我们现在来明确一个事,即生成可执行程序的过程中,都要经历那些步骤。
源文件.c->预处理.i->形成汇编.s->二进制文件(目标代码).o->可执行文件.exe
test.c:源代码
test.i:含有我们写的部分代码。将宏定义的值转换,将头文件展开,去注释
test.s:将代码全部转为汇编语言。
test.o:将汇编语言转为机器可识别的,即01。
test.exe:链接后形成该可执行程序。
对于链接的认识
链接分为动态链接与静态链接
理性认识一下:
你在你家做昨晚许多事之后,想洗浴一下,但是家里还没装热水器,于是你到了外面的洗浴中心,洗完回家再继续做你的事。
后来洗浴中心被查封了,你还是想好好洗澡,于是花了大价钱,把家里卫生间装的洗澡很舒服,你甚至还能让你的对象给你搓澡,给你放音乐。
在这个例子中
你家=你的代码
想做的事=执行程序
洗浴中心=库(有许多函数)
装修卫生间=将库拷贝到内部
至此我们可以总结一下动静态链接。
动态链接
优点:
1.形成的exe小(你不用装修卫生间)
2.运行快(exe小,你加载到内存的速度就快)
3.节省资源(不用花钱装修)
缺点:
会受动态库影响
静态链接
优点:
不受影响
缺点:
参考动态优点
我们现在初步感受一下,程序一般会用哪种方式链接呢?
让我们看看它们生成的可执行文件,再做选择。
我们发现,静态链接生成的文件是动态链接的100多倍。
一个1G的软件和一个100G的软件,你选哪个?
我们也可以用file命令来查看我们的程序。
可以清楚的看见谁是什么链接方式。
动态链接程序可以使用ldd来查看它的动态库。
动态链接库:前缀为lib,后缀为.so
静态链接库:前缀为lib,后缀为.a
所以我们去掉lib. 与 .so.6后,我们发现,它就是C标准库。
在linux中,大部分指令都是用C或C++编写的,所以linux自带动态库
而如果我们没有静态库,是无法进行静态链接的。
gcc/g++的使用
-E 只激活预处理-S 编译到汇编语言-c 编译到目标代码-o+文件名 形成的文件被命名为文件名-static 此选项对生成的文件采用静态链接-D+变量=值 可以在函数外对变量赋值(宏)
make与makefile(辣🧠)
基本使用
makefile是一个文件
make是一个命令
makefile:
我们可以在文件中创建makefile文件(m可以大写)
其文件内容为:依赖关系+依赖方法
例如前2行:
第一行(依赖关系),test.exe依赖test.c(没有test.c就不会有test.exe)
第二行(依赖方法),通过gcc来形成该文件
.PHONY:对象(则该对象被修饰为伪目标)
伪目标:总是执行该操作
解释伪目标意义
对于正常代码,我们在编译一次后,如果未修改,而要再次编译他,编译器为了节省成本,则不会再编译。对于一些其他指令也是如此。
而对于伪目标,则会不断执行操作。
linux如何判断一个文件是否被编译后未作修改呢?
我们学过查看文件的三个时间。
其中modify表示文件内容被修改。change表示文件属性被修改。
我们想一想,如果通过编译生成了test.exe文件。那么它的MODIFY时间一定比test.c文件的晚。
所以,如果我们再编译时,发现它们时间的大小关系没变,那么就说明test.c没有被修改。
对于多文件编译如下
不需要写出.h文件,他会自动在当前路径下找
make:
直接输make,它会默认执行makefile中第一行的操作
make+目标,则执行该操作
gdb(苦🧠)
初步认识
在我们完成编译链接后,我们终于得到了自己的可执行程序。这时,如果程序结果出错,我们便需要gdb来进行调试。
gdb使用
我们以下图代码进行演示:
首先,在编译时需要在文件名后+ -g选项,生成debug版本。
系统默认生成release版本。我们通过readelf -S可以查看两个版本的可执行文件信息。
debug版本会比release版本的可执行文件更大,多的部分用于调试。
使用gdb进入调试。
l:显示调试代码
l 0:从第一行开始显示
断点设置:
b N:在N行打一个断点
info b:查看断点
d N:删除N行断点
程序运行:
r:运行至断点处停止
n:逐过程
s:逐语句
c:运行至下一个断点
现在程序运行到第一个断点处,我们通过s进入函数
可以看到它在进行循环
查看变量:
p N:临时查看变量N
display N:常显示变量N
undisplay N:取消常显示N
finish:执行完当前函数
bt:查看函数堆栈
until n:跳转至第n行
我们通过上面的指令完成调试后,最后退出gdb即可
q:退出gdb
总结
本篇学习了linux的2个编译工具与一个重要的调试工具,其中make对于之后的项目使用有非常重要的作用
之后将学习其他基本工具,请继续关注现在想吃🧠的旗帜僵尸,我将会持续更新linux的后续学习内容
下次见