第一句子网 - 唯美句子、句子迷、好句子大全
第一句子网 > linux——基本工具:gcc/g++ make(makefile)与gdb

linux——基本工具:gcc/g++ make(makefile)与gdb

时间:2019-02-24 01:48:05

相关推荐

linux——基本工具:gcc/g++ make(makefile)与gdb

大家好,我是旗帜僵尸,今天想吃点🧠。现在我将带大家学习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的后续学习内容

下次见

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。