如何配置CEDET自动完成MinGW g ++

时间:2013-03-19 05:54:51

标签: emacs g++ mingw cedet

我认为CEDET是为MinGW gcc自动完成的,它运行得很好,但是我无法获得完成STL库成员的g ++工作。例如,我无法自动完成std :: string变量来获取c_str()或其他函数:

#include <string>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
    string s;
    s.       // no pop up member functions here
    return 0;
}

这是我的.emacs的配置部分:

;; setting up for semantic-mode
(semantic-mode 1)
(require 'semantic/bovine/c)

(setq MinGW-64-base-dir 
    "D:/MinGW/x86_64-w64-mingw32/include")
(add-to-list 'semantic-lex-c-preprocessor-symbol-file 
     (concat MinGW-64-base-dir "/crtdefs.h"))
(add-to-list 'semantic-lex-c-preprocessor-symbol-file 
     (concat MinGW-64-base-dir "/yvals.h"))
(add-to-list 'semantic-lex-c-preprocessor-symbol-file 
     (concat MinGW-64-base-dir "/vadefs.h"))
(add-to-list 'semantic-lex-c-preprocessor-symbol-file 
     (concat MinGW-64-base-dir "/comdefsp.h"))
(semantic-c-reset-preprocessor-symbol-map)

(defconst user-include-dirs
  (list ".." "../include" "../inc" "../common" "../public"
        "../.." "../../include" "../../inc" "../../common" "../../public"))
(defconst win32-include-dirs
  (list "D:/MinGW/include"
        "D:/MinGW/x86_64-w64-mingw32/include"
    "D:/MinGW/lib/gcc/x86_64-w64-mingw32/4.7.2/include"
    "D:/MinGW/lib/gcc/x86_64-w64-mingw32/4.7.2/include/c++"
    "D:/MinGW/lib/gcc/x86_64-w64-mingw32/4.7.2/include-fixed"
))

(let ((include-dirs user-include-dirs))
  (when (eq system-type 'windows-nt)
    (setq include-dirs (append include-dirs win32-include-dirs)))
  (mapc (lambda (dir)
          (semantic-add-system-include dir 'c++-mode)
          (semantic-add-system-include dir 'c-mode))
        include-dirs))

我的配置有问题吗?需要MinGW g ++的正确配置。

1 个答案:

答案 0 :(得分:0)

我在没有你的配置的情况下在我的Ubuntu系统上尝试过你的样本,它提供了比我知道更多的完成。我猜测Semantic不知道某些包含文件的位置,或者没有设置正确的预处理器符号。

如果你这样做:

M-x load-library RET semantic/analyze/debug RET

然后您可以将光标放在样品上并执行:

M-x semantic-analyze-debug-assist RET

它会给你一堆提示,以及试图深入研究问题的其他命令。

我知道您在设置中设置了所有包含和预处理器文件。那部分对我来说似乎没问题。

semantic / bovine / gcc.el中的代码应该向您的GCC查询您提供的用于查找STL标头之类的信息的类型。编译器提供了STL头使用的某些#define值,可能不在您为预处理器符号提供的其他ming头中。

不幸的是,它为其尝试使用的C ++编译器提供了硬编码名称。如果您的编译器有其他名称,则可能需要编辑gcc.el源文件才能使其正常工作。如果您这样做,请发送电子邮件至cedet-devel邮件列表,以便我们在CEDET中进行更改。

或者,在string.h文件的任何位置加载,并找到它应该用于完成的定义。看看哪些#if语句将其过滤掉,然后使用:

M-x语义 - 描述 - 环境RET

了解这可能是如何相关的。