使用ctags来方便看CANN代码

举报
黄生 发表于 2022/06/06 11:04:39 2022/06/06
【摘要】 操作界面从字符界面发展到图形界面,是一个进步。而且图形界面也基本上取代了字符界面成为了主流。但是,这里要说的主要是字符界面上的操作,因为在有些使用场景,字符界面反而是比较方便的。为什么会这样呢?举个例子来说,环境越少,做起事来就越方便。也就是说开发编译和运行程序是在一个环境上,比开发编译一个环境,运行程序又是另外一个环境,是要更方便的。但是只用一套环境呢往往又没有比较方便的图形化的开发环境,...

操作界面从字符界面发展到图形界面,是一个进步。而且图形界面也基本上取代了字符界面成为了主流。
但是,这里要说的主要是字符界面上的操作,因为在有些使用场景,字符界面反而是比较方便的。为什么会这样呢?举个例子来说,环境越少,做起事来就越方便。也就是说开发编译和运行程序是在一个环境上,比开发编译一个环境,运行程序又是另外一个环境,是要更方便的。但是只用一套环境呢往往又没有比较方便的图形化的开发环境,所以我们有必要在字符界面也将开发环境整理的比较顺手,至少是查看代码要比较方便。这里就讲一讲如何使用ctags来方便看CANN的样例代码。
ctags可以直接通过发行包来安装:
image.png
简要介绍一下:
Ctags generates an index (or tag) file of C language objects found in C source and header files. The index makes it easy for text editors or other utilities to locate the indexed items.
Ctags can also generate a cross reference file which lists information about the various objects found in a set of C language files in human readable form. Exuberant Ctags improves on ctags because it can find all types of C language tags, including macro definitions, enumerated values (values inside enum{…}), function and method definitions, enum/struct/union tags, external function prototypes, typedef names and variable declarations.
Exuberant Ctags is far less likely to be fooled by code containing #if preprocessor conditional constructs than ctags. Exuberant ctags supports output of Emacs style TAGS files and can be used to print out a list of selected objects found in source files.

在要看的具体代码例子目录下运行ctags,只扫描文件内容判定为c++的文件,除了当前目录,还扫描CANN的头文件目录,当然使用递归扫描。tags文件很快就生成出来了。
image.png

然后进入vim,输入:tag main就可以跳转到main函数的定义处:
image.png

鼠标点击肯定是比键盘移动到某一个代码上是要方便的,所以我们在vim里把鼠标点击打开。
set mouse=a
但是当我们要选择复制出终端(比如MobaXterm)里的一段文字时,这时候选择复制的功能就会失效,我们将鼠标点击关闭就可以了。
set mouse=
把鼠标点到类型名称 pthread_t 上,按C-]进行定义跳转,发现没有跳转。因为这是一个操作系统提供的类型,并没有收录到tags里,所以说:tag not found.
image.png

把鼠标点到函数 setup_acl_device 上,按C-]进行定义跳转,就跳转成功了,到了该函数的定义处:
image.png

这个里面调用了 aclInit ,点上去看看定义,但是tag not found。这是为什么呢?这是CANN里提供的函数,为什么跳转不到定义,前面不是将CANN的头文件收录到tags里了吗?这是因为“函数声明”这一语法元素ctags默认是不记录的,而aclInit应该是只在头文件里声明了函数原型,在库文件里提供了运行代码,CANN并没有提供aclInit的函数定义源代码,所以我们修改一下ctags运行命令,要求ctags记录c++文件中的函数声明和各种外部和前向声明:
ctags -R --languages=c++ --c++-kinds=+px . /usr/local/Ascend/ascend-toolkit/latest/include/
然后就可以跳转到tag aclInit 了:
image.png

这样能够跳转到函数原型,查看原型定义信息,还是比较方便的,比去查文档要方便直接一些,如果有需要再去查阅一下API文档
image.png

现在函数原型声明是可以跳转了,但是又出现了一个问题,那就是函数原型声明和函数定义都有的时候,默认只跳到函数原型了,这可不行。比如前面的函数 setup_acl_device ,把鼠标点到函数 setup_acl_device 上,按C-]进行定义跳转,跳到了原型声明的的头文件里,而不是函数定义里:
image.png

这种情况下,改变跳转的默认行为就可以了,按 g<C-]> 就会弹出tag列表,选择函数定义就可以了:
image.png
这里列出了 函数原型声明和函数定义,我们显然要跳转到函数定义,所以选择2就可以了。

好了,基本用法就介绍到这里,有些常用配置可以放置在vim的启动配置文件中,免去重复输入的麻烦。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。