Linux中gcc、gdb、ctags的使用

一、程序的编译链接

一个源代码要成为一个可执行程序,需要经过编译器的编译、链接。

在Linux中的编译器主要有两种:gcc 、 g++ ;gcc主要用于编译C代码;g++用于编译C++代码。

Linux中gcc、gdb、ctags的使用_第1张图片


那如何查看编译的三个小过程呢?

预处理:

Linux中gcc、gdb、ctags的使用_第2张图片

通过上图,可以看到生成了一个.i文件;命令:gcc -E test.c -o test.i

解释:gcc 表示用gcc编译器编译 ; -E 是表示将源文件在预处理完成后便停止;-o 用来确定输出文件名称的

预处理完成后保存到 test.i中。

编译:

Linux中gcc、gdb、ctags的使用_第3张图片

命令:gcc -S test.i -o test.s   

解释:-S 表示进行到“编译”完成后就结束,


汇编:

Linux中gcc、gdb、ctags的使用_第4张图片

命令:gcc -c  test.s -o test.o

解释:-c 表示进行到汇编完成后就结束,

这三个过程中的ESc可以通过键盘的退出键“Esc”进行联想记忆,但需注意大小写问题。

在写代码的时候往往要用到各种库函数;那么要使用这些库函数,便需要链接这些库。


二、gcc中的链接

在写代码的时候往往要用到各种库函数;那么要使用这些库函数,便需要链接这些库。

库可以分为:动态库、静态库

动态库:资源的利用率高,但程序的执行需要依赖第三方库  (.a)

静态库:程序不依赖任何第三方库; 可移植性好,但太占资源 ( .so )

那么gcc编译程序时用的是哪种链接库?

查看文件所链接的库:

 命令: ldd  可执行文件 

例如:

Linux下的库文件命名中 : lib 表示库 ; .a 或 .so 表示其属性(静态或动态);通过上图可发现其 是名为 c 的动态库; Linux下头文件和库文件默认目录 :头文件 (.h): /usr/include/目录 ;库文件 (.so, .a): /usr/lib/目录 

如果想让一个程序静态链接的话,可以在编译的时候加上 -static 命令;

三、gdb的使用

1、进入gdb

在gcc编译器下默认采用的是动态链接和 Release版本;gdb是调试工具,只能在Debug版本下进行调试。

在编译的时候使用 -g 选项便可以是程序的执行环境为Debug;

Release版本:


Debug版本:


可以看出Release版本是经过优化的。

进入调试界面:命令 :gdb 可执行文件

Linux中gcc、gdb、ctags的使用_第5张图片

2.常用的gdb调试命令

功能: 显示代码
命令: l 行号   // 显示某行代码     l 是 list的简写
l    l 文件名:函数名   //某一个函数

功能: 打断点
命令 : b  行号                    // 在某一行打断点,break port 打断点
b  函数名(main)
b test.c:sum  //在test.c 的sum函数出打断点

功能: 查看断点
info b      //查看断点

功能: 删除断点
命令: d 断点编号    //delete port 删除断点

功能: 运行程序
命令: r          //run 停在断点

功能: 执行下一条过程
命令: n      //next (逐过程调试)

功能: 进入函数
命令: s        //step(逐语句调试)



功能: 查看变量的值
命令: p 变量名
display 变量名    // 常显示

undisplay 序号(变量的序号)  //去常显示

说明: gdb指令有记忆功能(回车执行最近的指令),display变量之后会不断显示这个变量的值


命令: until 行号   //跳转至任一行

功能: 跳到下一个断点
命令: c      //c 是 continue的缩写,相当与VS中的F5

功能: 查看函数调用
命令: bt   

功能: 函数运行完毕即停止
命令: finish 


功能: 关闭断点   

命令: disable 断点号  //屏蔽该端点

功能: 开启断点 

命令:   enable 断点号   //解屏蔽


功能: 设置某个变量的值

命令: set var i=99   //设置某个变量的值

退出gdb: quit

四、ctags的使用

ctags(Generate tag files for source code)是vim下方便代码阅读的工具。

生成索引文件   命令:ctags –R .

“-R”表示递归创建,也就包括源代码根目录(当前目录)下的所有子目录。“*”表示所有文件。这条命令会在当前目录下产

生一个“tags”文件,当用户在当前目录中运行vi时,会自动载入此tags文件。Tags文件中包括这些对象的列表:用#define定

义的宏枚举型变量的值函数的定义、原型和声明名字空间(namespace)类型定义(typedefs)变量(包括定义和声明)类

(class)、结构(struct)、枚举类型(enum)和联合(union)类、结构和联合中成员变量或函数VIM用这个“tags”文件来

定位上面这些做了标记的对象。

ctags的下载:

进入root权限:输入命令:yum install  ctags 

ctags的使用:

在某个工程中输入命令:ctags –R .便可以在当前目录下生成一个tags文件;

在某个函数前面使用:


" Ctrl键和  右中括号 ] " 便可以进入这个函数内部 (相当于VS中的转到函数定义);


“ Ctrl键 和 t ”便可以返回到函数声明(相当于VS中的转到函数声明);

你可能感兴趣的:(Linux)