阅读了一篇名为" CEDET的温和介绍"由Alex Ott撰写的。我在我的emacs 24.3中进行了一些c ++项目的实验,并在" https://git.code.sf.net/p/cedet/git"中进行了最新的cedet实验。 (也在emacs 23.1和稳定的cedet1.1中)。我很满意它,除了一个小的"跳转到功能工具" " semantic-analyze-proto-impl-toggle"中的问题。 我的项目很简单(只有2个文件):
1)头文件" y.hpp"在dir"〜/ emacs / test / zz1 /"
class y{
public:
int y1(int);//error here! semantic can't found implement in y.cpp
};
2)实施文件" y.cpp"在dir"〜/ emacs / test / zz2 /"
#include "y.hpp"
int y::y1(int b) // semantic can found definition in y.hpp
{
return 0;
}
我的cedet配置基于alex oot" minimial-cedet-config.el "(https://gist.github.com/alexott/3930120)并且只添加以下两个行:
(semantic-add-system-include"〜/ emacs / test / zz1 /"' c ++ - mode)
(semantic-add-system-include"〜/ emacs / test / zz2 /"' c ++ - mode)
我检查了我的语义数据库缓存,发现所有数据库文件都正确创建, 这是zz1中的y.hpp的缓存db中的部分信息:
("y1" function
(:prototype-flag t
:arguments
( ("" variable (:type "int") (reparse-symbol arg-sub-list) [27 31]))
:type "int")
(reparse-symbol classsubparts) [20 32])
这是zz2中y.cpp的缓存db中的部分信息:
("y1" function
(:parent "y"
:arguments
( ("b" variable (:type "int") (reparse-symbol arg-sub-list) [28 34]))
:type "int")
nil [18 50])
答案 0 :(得分:1)
我得到了 Eric Ludlam的建议。我认为问题是Semantic不知道这两个文件 属于同一个项目。系统标题技巧可能有助于一个 方向,但不是双向的。
教它属于同一个项目的方法是启用它 EDE,然后确保那里有一个EDE项目,比如使用 'ede-cpp-root'项目类型,如下所示:
;;确保fname存在**
(ede-cpp-root-project“TEST”:文件“〜/ emacs / test / fname” :include-path'(“/ zz1”“/ zz2”))
既然你已经有了
<强>(EDE启用泛型的项目)强>
你也可以把一切都放在git或CVS中,它会 发现它是一个项目。然后自定义项目并添加包含路径 确保它能找到所有东西。
一旦开始使用EDE项目来指定项目根,语义 将为其导航和完成系统提供更好的支持。
和我们不再需要关注两行:
(semantic-add-system-include“〜/ emacs / test / zz1 /”'c ++ - mode)
(semantic-add-system-include“〜/ emacs / test / zz2 /”'c ++ - mode)