前一段时间在学习移植uboot的时候,有些函数不需要编译,但是它却编译了,导致了make的失败。这时候,我们就需要去看看那些函数到底在哪里定义的。但是面对一个庞大的文件夹,里面有大量的代码,有大量的函数,谁能知道某个函数在哪里定义,如果一个一个文件的找,无异于大海捞针。然后通过老师知道了有Ctags这个工具,于是我就去网上学习了一下,轻松的解决了问题。前一段时间并没有去写这篇博客,一直推到现在,那我们就来说一下Ctags这个工具吧。
Ctags工具是用来遍历源代码文件生成tags文件,这些tags文件能被编辑器或其它工具用来快速查找定位源代码中的符号(tag/symbol),如变量名,函数名等。
使用yum命令安装
sudo yum install -y ctags
下载源码安装
1)从http://ctags.sourceforge.net/下载源代码包后,解压缩生成源代码目录;
2)然后进入源代码根目录执行./configure,生成Makefile文件;
3)然后执行make;
4)编译成功后执行make install。
安装完ctags之后,我们一般第一个命令就是:
[PainEver@maple linux-3.0.1]$ ctags -R *
注释:“-R”表示递归创建,包括当前目录下的所有目录;“*”表示所有文件。这条命令会在当前目录下产生一个“tags”文件。
[PainEver@maple linux-3.0.1]$ ls tags
tags
当我们vim tags进入这个文件会看到,这个文件就像是一个列表,包含了以下对象:
具体是怎写的,有兴趣的可以进tags这个文件中看看。
在生成一个ctgs文件之后,我们要想查找函数,变量,结构体什么的就可以执行下面这个命令:
[PainEver@maple linux-3.0.1]$ vim -t xxx /*把xxx换成你想要查找的对象*/
/*比如我们要查找i2c_driver这个结构体*/
[PainEver@maple linux-3.0.1]$ vim -t i2c_driver
然后就会出现下面这个界面:
# pri kind tag 文件
1 F m i2c_driver include/drm/drm_encoder_slave.h
struct:drm_i2c_encoder_driver typeref:struct:drm_i2c_encoder_driver::i2c_driver
struct i2c_driver i2c_driver;
2 F s i2c_driver include/linux/i2c.h
Type number and <Enter> (empty cancels):
这个界面就是包含了i2c_driver出现过的所有地方。我们选择需要查看的编号,输入1或2按下enter键即可查看。
还有一种情况,就是我们在看代码的时候,里面会出现各种各样的函数,变量,宏,结构体等等的调用,那我们如何查看被调用这些对象是在哪里定义的呢?我们把光标移动到想要查看的对象上,按”ctrl+]”,就可以直接跳转到这个对象定义的地方。
注意:运行vim的时候,必须在“tags”文件所在的目录下运行。否则,运行vim的时候还要用“:settags=”命令设定“tags”文件的路径,这样vim才能找到“tags”文件。
“ctrl+t“退回至上次查找的变量,如果用户使用了N次“Ctrl+]”查找了N个变量,我们也可以通过N次”ctrl+t“退回最初的位置。
其实有一种方法更方便,就是上下左右的左右键,比如我们查找了a、b、c、d这四个变量,那么在tags缓冲区内,就会有a、b、c、d这四个变量,假设我们现在在看d变量,我们想要去看之前查看的c变量时,就可以通过左键退回上一次查看的变量,然后如果我们想要再看d变量,就可以通过右键在跳转到d变量上。
一般来说我们能够用到的就这几个基础命令,想要深入了解,就 man ctags 具体看一下吧。