我试图在我的Makefile中创建一个目标,以使用ctags自动创建tags文件。

我有一个源文件(.cpp文件)列表,但没有所有头文件的列表(我使用g++ -MM创建了头文件依赖项列表)。

我本来以为ctags会在生成标签时遵循.cpp文件中的所有#include指令,但是看来我的假设是错误的。

如果我创建一个像这样的简单标签文件:

ctags  --fields=+iaS --extra=+q myClass.cpp

然后进入vim并输入对象名称,后跟“。”。我收到错误“未找到模式”。

但是,如果我像这样编译标签文件:
ctags  --fields=+iaS --extra=+q myClass.cpp myClass.h

并在vim中做同样的事情,我得到了一个漂亮的自动完成的成员变量/函数列表。

我的“myClass.cpp”文件中的第一行是
#include "myClass.h"

那么,为什么ctags也不使用它来解析头文件呢?

最佳答案

不。不幸/不幸的是。

遵循您自己的包含,不会有太多问题。问题开始于

  • 条件编译
  • 外部(系统)库。

  • 幸运的是,您可以通过执行类似的操作轻松解决您自己的库的问题
    ctags *.h *.cpp
    ctags -R src/
    

    您可以先将cppctags一起砍掉一些东西。它不会方便地工作。一种半感兴趣的方法是修补ctags以跟随#line输出中的cpp杂注,从而将所有标签关联到它们各自的源。

    但是,这种方法无法按您期望的任何预处理器符号/定义进行操作(宏已经扩展,因此您将无法通过ctags查找宏)。

    解决此问题的常用方法是为您的外部库生成一个“标准”标签文件,并且
    :se tags+=/home/me/libs/tags.stdc++
    :se tags+=/home/me/libs/tags.libsox
    

    等等。一些库提供了有关如何制作与其库一起使用的有用标记文件的教程(或假定特定文件夹布局的预构建标记文件)。

    关于vim - 可以使ctag遵循#include指令吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7848911/

    10-12 03:27