cscope - 如何运行 cscope 以仅在任意位置搜索源代码并将交叉引用文件写入另一个任意位置?

标签 cscope

这是我的源代码目录的样子。

learner@centos:~/lab$ tree
.
+-- cscope.out
+-- src
¦   +-- bar
¦   ¦   +-- bar.c
¦   ¦   +-- baz
¦   ¦       +-- baz.c
¦   +-- foo.c
¦   +-- qux
¦       +-- qux.c
+-- work

我想在文件系统上的任意位置(~/lab/src/bar)为源代码文件创建交叉引用,并将交叉引用写入任意位置(~/lab/work/cscope.out) 在这种情况下。

除了 ~/lab/src/bar 之外,交叉引用中不应包含任何内容。

当然,以下命令不起作用。它包括 ~/lab/src/*.c~/lab/src/qux/*.c 也在交叉引用中

learner@centos:~/lab$ cscope -b -R -f ~/lab/work/cscope.out
learner@centos:~/lab$ grep "@.*src" ~/lab/work/cscope.out
        @src/bar/bar.c
        @src/bar/baz/baz.c
        @src/foo.c
        @src/qux/qux.c

以下命令也遇到同样的问题,因为默认情况下会自动隐含搜索当前目录。

learner@centos:~/lab$ rm ~/lab/work/cscope.out
learner@centos:~/lab$ cscope -b -R -f ~/lab/work/cscope.out -s ~/lab/src/bar
learner@centos:~/lab$ grep "@.*src" ~/lab/work/cscope.out
        @/home/learner/lab/src/bar/bar.c
        @/home/learner/lab/src/bar/baz/baz.c
        @src/bar/bar.c
        @src/bar/baz/baz.c
        @src/foo.c
        @src/qux/qux.c

以下命令不起作用。

learner@centos:~/lab$ rm ~/lab/work/*
learner@centos:~/lab$ cscope -b -R -f ~/lab/work/cscope.out ~/lab/src/bar
Cannot open file /home/learner/lab/src/bar

对于 ctags,类似的命令可以正常工作。

learner@centos:~/lab$ ctags -R -f ~/lab/work/tags ~/lab/src/bar
learner@centos:~/lab$ grep src ~/lab/work/tags
bar     /home/learner/lab/src/bar/bar.c  /^void bar()$/;"        f
baz     /home/learner/lab/src/bar/baz/baz.c      /^void baz()$/;"        f
main    /home/learner/lab/src/bar/bar.c  /^int main()$/;"        f
main    /home/learner/lab/src/bar/baz/baz.c      /^int main()$/;"        f

如何使用 cscope 做同样的事情?

到目前为止,我发现的唯一解决方法是先切换到一个空目录,然后使用 -s ~/lab/src/bar 运行 cscope 命令。这将搜索指定目录和当前目录,但由于当前目录为空,因此交叉引用中只会包含指定目录中的文件。

learner@centos:~/lab$ rm ~/lab/work/*
learner@centos:~/lab$ cd ~/lab/work
learner@centos:~/lab/work$ cscope -b -R -f ~/lab/work/cscope.out -s ~/lab/src/bar
learner@centos:~/lab/work$ grep "@.*src" ~/lab/work/cscope.out
        @/home/learner/lab/src/bar/bar.c
        @/home/learner/lab/src/bar/baz/baz.c

是否有另一种不需要我将当前目录更改为空目录的解决方案?

注意:该解决方案应该适用于一般用例。

  • 可能有数百个其他文件和目录不能包含在交叉引用中(如上例中的 foo.cqux)。
  • 可能有.h.l.y等其他扩展名的文件需要交叉-引用。

最佳答案

这里的技巧是知道 cscope 也将接受源文件列表而不是自己搜索。所以传递文件列表是要解决的问题。

寻找救援。

cscope -b -f <path_to_refdir>/cscope.out `find <path_of_desired_src_tree> -name *.[chly]`

你的情况

cscope -b -f work/cscope.out `find src/bar -name *.[chly]`

关于cscope - 如何运行 cscope 以仅在任意位置搜索源代码并将交叉引用文件写入另一个任意位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35869811/

相关文章:

c - 在单独的目录中构建 cscope.out 文件

vim - 在 vim 中查找局部变量的引用

c - 如何使用 cscope 一次搜索多个 C 符号

ctags错误 "format error in tags file"

vim - cscope 是否支持历史列表记录?

php - PHP 的 ctags/Cscope 更准确的替代/解决方法?

c - 将 cscope 与 VIM 一起使用 : adding database returns errno 75

linux - 如何从任何目录运行 cscope?

vim - 如何忽略结构声明并仅考虑 cscope 中的定义?