【Linux】编译器gcc/g++与调试工具gdb

编译链接过程:

一个程序在翻译的过程得经历4个阶段:

1、预处理:头文件展开、宏替换、去注释、条件编译(#if / #endif);

gcc -E // -o(保存到后序文件中) 生成 .i 文件

2、编译:将 C 代码翻译成汇编代码;

gcc -S // 生产 .s 文件

3、汇编:汇编语言翻译成可重定向目标文件(二进制文件);

gcc -c // .o 文件

4、链接:生产可执行文件

gcc 目标文件

动、静态库:

gcc 生成的可执行程序文件只有函数的调用,并没有函数的实现,链接的过程本质是将自己的调用过程和具体的实现过程关联起来,然后再去库里找。

ldd filename :查看所依赖库

库文件:libname.a (.so),name 是库名称,a-静态库,so-动态库 [Linux centos 系统];

静态库(.a):直接把库的实现拷贝到可执行程序中。

优点:不依赖第三方库,因为已经拷贝了,可移植性较好;

缺点:1、浪费空间 2、运行速度慢;

动态库(.so):

优点:1、省空间(磁盘运行时内存空间),比如10个c文件加载到内存当中,它们所依赖的库相同,就不用拷贝10份,拷贝1份即可。

2、体积小,所以加载速度快;

缺点:依赖动态库,导致程序可移植性较差;

静态链接:gcc 默认是动态链接,如要静态链接,在生成可执行程序时加 -static 。

gdb调试:

+ -g:debug版本

调试命令:无命令回车执行上一条命令;

1、gdb filename:进入debug模式;

2、l(list)/ l n:显示代码,从n行开始;

3、b n / b 函数名:打断点;

4、info b:查看断点信息;

5、d 断点num:去掉断点;

6、r:运行代码;

7、p 变量:查看变量信息;

8、n(next):单步执行,逐过程;

9、s(step):逐语句;

10、display 变量:查看监视窗口;

11、undisplay 编号:从窗口中移除;

12、until 行号:从循环中走出去(如果该代码无效,就跳到最近有效代码的代码行);

13、finish:将对应的函数运行完毕;

14、c(continue):跳到下一个断点处;

15、set var:修改变量值;

16、disable 断点num:禁用断点;

17、bt:查看调用栈;

18、quit:退出;

你可能感兴趣的:(Linux,linux)