【问题标题】:How to fix duplicate cscope ? is it a better way?如何修复重复的 cscope ?这是更好的方法吗?
【发布时间】:2017-05-26 20:30:55
【问题描述】:

我用 vim 编程已经好几年了,我使用了 ctags。 我正在使用一个相当大的 C/C++ 包,我需要找到函数的定义。我通常使用 grep + ctags。 最近我尝试使用 cscope 代替 ctags 并使用 Vundle 安装它。 我的某些文件出现以下错误

E568: duplicate cscope database not added

我在网上搜索并找到了这个: https://blogs.oracle.com/natarajan/entry/avoiding_duplicate_cscope_database_error 它不起作用。

我该如何解决这个问题?

【问题讨论】:

  • 您在 * 上的最佳选择是每个问题坚持一个 question,而不是在单个帖子中添加第二个问题。事实上,你的第二个问题对于 * 来说不是一个好的格式; * 最适用于可能有“正确”答案的问题,并且要求工具推荐不符合该格式。请参阅What topics can I ask about 了解更多信息,尤其是“要求我们推荐或查找...的问题”。

标签: vim ctags cscope


【解决方案1】:

根据博客,“当 VIM 已经使用 'CSCOPE' 模块编译并且您还安装了“cscopemenu.vim”时会弹出此错误”。我假设您有一个带有 configured 和 --enable-cscope 选项的 vim 可执行文件。

这是我的工作:

  • 下载 cscope 源并构建它,将可执行文件安装在您的PATH 中可用的目录中
  • --enable-cscope下载vim源代码和configure,构建源代码并安装可执行文件
  • 下载cscope_maps.vim并将其放在$HOME/.vim/plugin目录下。这包含 vim 的 cscope 设置。
  • 从源文件和头文件中创建 cscope 数据库。您可以执行以下操作

find $PROJECT_HOME -name *.c -o -name "*.cpp" -o -name "*.cc" -o -name "*.h" -o -name "*.hpp" > cscope.files

cscope -qbR -i cscope.files

您可以将这些命令添加到别名中,并在每次要更新 cscope 数据库时执行别名。这两个命令 create 最终创建cscope.out 数据库文件。

  • 更新 .vimrc 文件以具有以下内容

    if has("cscope") set csprg=<location to cscope executable> set csto=0 cs add <location to cscope.out> endif

我希望在完成这些步骤之后,您应该能够轻松地将 cscope 与 vim 一起使用。

请注意,如果您正在处理多个项目,您应该能够添加适当的环境变量以使 vim 能够选择正确的 cscope 数据库。

要回答您的第二个问题,我建议您使用tagbar。这将在当前源文件或头文件中列出您的函数名称。您可以使用Vundle 安装它。将以下行添加到您的 .vimrc

Plugin 'majutsushi/tagbar'

将此添加到您的 .vimrc 以切换标签栏视图

nmap &lt;F4&gt; :TagbarToggle&lt;CR&gt;

请注意,F4 只是一个示例,您可以使用任何绑定来做同样的事情。

【讨论】:

    【解决方案2】:

    找到对我有用的解决方案(此处:http://thoughtsolo.blogspot.com/2014/02/cscope-issue-duplicate-cscope-database.html):

    只需将这一行“set nocscopeverbose”添加到您的 ~/.vimrc 文件中。

    【讨论】:

      【解决方案3】:

      扩展至Artem's answer

      cscopeverbose 的 Vim 帮助如下:

      如果没有设置'cscopeverbose'(默认),则不会打印消息 添加 cscope 数据库时指示成功或失败。理想情况下,你 在添加任何 cscope 数据库之前,应在 .vimrc 中重置此选项, 添加它们后,设置它。从那时起,当您添加更多数据库时 在 Vim 中,如果数据库失败,您将收到(希望)有用的消息 待补充。

      这里的问题是 (a) 有多个脚本试图加载 cscope.out 文件,并且 (b) 他们没有遵循在加载文件之前禁用“详细”cscope 警告然后重新之后启用它,如上面的帮助文本所建议的那样。

      完整的错误输出应该告诉你哪个脚本触发了这个警告;对我来说,它看起来像这样:

      Error detected while processing /home/me_and/.vim/plugin/cscope_maps.vim:
      line   42:
      E568: duplicate cscope database not added
      

      修复方法是编辑 ~/.vim/plugin/cscope_maps.vim 文件,在 cs add ... 行之前添加 set nocscopeverbose。我的这个文件的版本已经有set cscopeverbose,但如果你没有,你也应该添加它。

      【讨论】:

      • 感谢您的回答 - 当我今天遇到 OP 的问题时,这个问答帮助了我。如果你碰巧知道,我很好奇为什么这个补丁是必要的。我最近从 fc20 -> fc29 升级我的 Fedora 核心后第一次遇到这个问题。我在升级前后安装了相同版本的 vim 和 cscope,所以我很好奇为什么事情会从工作状态变为非工作状态。