4

所以,我现在使用 CEDET 已经有一段时间了,总的来说一切都很好。我正在从将它与 C 一起使用到 C++,特别是对于 OpenCV 2.3 (linux),我遇到了问题。我正在将 emacs24 与 CEDET 的最新开发版本一起使用。

它无法解析某些符号及其成员,例如:KeyPoint, Mat,等。

然而,许多函数符号都被解析了,例如line(), imshow(), imread()等。

我正在寻找有关如何调试我的设置有问题的帮助,或者寻求成功设置 opencv c++ api 的人的帮助。

这是我相关的 cedet 配置:

;; brian-cedet.el
;; Contains my personal configuration for CEDET

;; Loads for CEDET 
(load-file "/home/terranpro/code/cedet/common/cedet.el")

(add-to-list 'Info-default-directory-list
             (expand-file-name "~/code/cedet/common"))
(add-to-list 'Info-directory-list
             (expand-file-name "~/code/cedet/common"))

(add-to-list 'Info-directory-list
             (expand-file-name "~/code/cedet/semantic/doc"))
(add-to-list 'Info-directory-list
             (expand-file-name "~/code/cedet/eieio"))
(add-to-list 'Info-directory-list
             (expand-file-name "~/code/cedet/speedbar"))
(add-to-list 'Info-directory-list
             (expand-file-name "~/code/cedet/cogre"))
(add-to-list 'Info-directory-list
             (expand-file-name "~/code/cedet/ede"))
(add-to-list 'Info-directory-list
             (expand-file-name "~/code/cedet/srecode"))

(require 'ede)

(global-ede-mode t)

;;(semantic-load-enable-minimum-features)
(semantic-load-enable-code-helpers)
;;(semantic-load-enable-gaudy-code-helpers)
(semantic-load-enable-excessive-code-helpers)
;;(semantic-load-enable-semantic-debugging-helpers)

(require 'semantic-ia)

(require 'semantic-gcc)

(require 'semantic-sb)

(require 'semanticdb)
(global-semanticdb-minor-mode 1)

(require 'semanticdb-global)
(semanticdb-enable-gnu-global-databases 'c-mode)
(semanticdb-enable-gnu-global-databases 'c++-mode)

(require 'semantic-c)

(setq semantic-load-turn-useful-things-on t)

(semantic-add-system-include "/usr/include/glib-2.0" 'c-mode)
(semantic-add-system-include "/usr/include/glib-2.0" 'c++-mode)
(semantic-add-system-include "/usr/include/gtk-3.0" 'c-mode)
(semantic-add-system-include "/usr/include/gtk-3.0" 'c++-mode)

(semantic-add-system-include "/usr/local/include/" 'c-mode)
(semantic-add-system-include "/usr/local/include/" 'c++-mode)

(semantic-add-system-include "/usr/local/include/opencv" 'c-mode)
(semantic-add-system-include "/usr/local/include/opencv2" 'c++-mode)
(semantic-add-system-include "/usr/local/include/opencv" 'c-mode)
(semantic-add-system-include "/usr/local/include/opencv2" 'c++-mode)

(add-to-list 'semantic-lex-c-preprocessor-symbol-file 
         '"/usr/local/include/opencv2/core/types_c.h")
(add-to-list 'semantic-lex-c-preprocessor-symbol-file 
         '"/usr/local/include/opencv2/imgproc/types_c.h")

(add-to-list 'semantic-lex-c-preprocessor-symbol-map '("CV_PROP_RW" . ""))
(add-to-list 'semantic-lex-c-preprocessor-symbol-map '("CV_EXPORTS" . ""))
(add-to-list 'semantic-lex-c-preprocessor-symbol-map '("CV_EXPORTS_W_SIMPLE" . ""))

(defun my-cedet-hook ()
  (local-set-key [(control return)] 'semantic-ia-complete-symbol)
  (local-set-key "\C-c?" 'semantic-ia-complete-symbol-menu)
  (local-set-key "\C-c>" 'semantic-complete-analyze-inline)
  (local-set-key "\C-c=" 'semantic-decoration-include-visit)
  (local-set-key "\C-cj" 'semantic-ia-fast-jump)
  (local-set-key "\C-cq" 'semantic-ia-show-doc)
  (local-set-key "\C-cs" 'semantic-ia-show-summary)
  (local-set-key "\C-cp" 'semantic-analyze-proto-impl-toggle)
  (local-set-key "\C-c+" 'semantic-tag-folding-show-block)
  (local-set-key "\C-c-" 'semantic-tag-folding-fold-block)
  (local-set-key "\C-c\C-c+" 'semantic-tag-folding-show-all)
  (local-set-key "\C-c\C-c-" 'semantic-tag-folding-fold-all))
(add-hook 'c-mode-common-hook 'my-cedet-hook)
(add-hook 'emacs-lisp-mode-hook 'my-cedet-hook)
(add-hook 'lisp-interaction-mode-hook 'my-cedet-hook)

(global-semantic-tag-folding-mode 1)
4

2 回答 2

4

我现在有一个工作配置;感谢 cedet-devel 邮件列表中的 Alex Ott 和 David Engster。要注意他们的更正,我的配置中有一些“不需要并且可能有害”的行。更新配置后,删除 ~/.semanticdb 中的所有文件并重新启动 emacs,一切正常!

我还包含了一个用于测试配置的示例 cpp 文件。多谢你们!

(load-file "/home/terranpro/code/cedet/common/cedet.el")

(require 'ede)

(global-ede-mode t)

;;(semantic-load-enable-minimum-features)
(semantic-load-enable-code-helpers)
;;(semantic-load-enable-gaudy-code-helpers)
(semantic-load-enable-excessive-code-helpers)
;;(semantic-load-enable-semantic-debugging-helpers)

;; CEDET-devel mailing list said these werent needed
;; and possibly hurtful
;;(require 'semantic-ia)

;;(require 'semantic-gcc)

;;(require 'semantic-sb)

;;(require 'semanticdb)
;;(global-semanticdb-minor-mode 1)

;;(require 'semanticdb-global)

(semanticdb-enable-gnu-global-databases 'c-mode)
(semanticdb-enable-gnu-global-databases 'c++-mode)

(require 'semantic-c)

(setq semantic-load-turn-useful-things-on t)

(semantic-add-system-include "/usr/local/include/" 'c-mode)
(semantic-add-system-include "/usr/local/include/" 'c++-mode)

(add-to-list 'semantic-lex-c-preprocessor-symbol-file 
         '"/usr/local/include/opencv2/core/types_c.h")
(add-to-list 'semantic-lex-c-preprocessor-symbol-file 
         '"/usr/local/include/opencv2/imgproc/types_c.h")

(add-to-list 'semantic-lex-c-preprocessor-symbol-map '("CV_PROP_RW" . ""))
(add-to-list 'semantic-lex-c-preprocessor-symbol-map '("CV_EXPORTS" . ""))
(add-to-list 'semantic-lex-c-preprocessor-symbol-map '("CV_EXPORTS_W_SIMPLE" . ""))
(add-to-list 'semantic-lex-c-preprocessor-symbol-map '("CV_EXPORTS_W" . ""))
(add-to-list 'semantic-lex-c-preprocessor-symbol-map '("CV_EXPORTS_W_MAP" . ""))
(add-to-list 'semantic-lex-c-preprocessor-symbol-map '("CV_INLINE" . ""))

(defun my-cedet-hook ()
  (local-set-key [(control return)] 'semantic-ia-complete-symbol)
  (local-set-key "\C-c?" 'semantic-ia-complete-symbol-menu)
  (local-set-key "\C-c>" 'semantic-complete-analyze-inline)
  (local-set-key "\C-c=" 'semantic-decoration-include-visit)
  (local-set-key "\C-cj" 'semantic-ia-fast-jump)
  (local-set-key "\C-cq" 'semantic-ia-show-doc)
  (local-set-key "\C-cs" 'semantic-ia-show-summary)
  (local-set-key "\C-cp" 'semantic-analyze-proto-impl-toggle)
  (local-set-key "\C-c+" 'semantic-tag-folding-show-block)
  (local-set-key "\C-c-" 'semantic-tag-folding-fold-block)
  (local-set-key "\C-c\C-c+" 'semantic-tag-folding-show-all)
  (local-set-key "\C-c\C-c-" 'semantic-tag-folding-fold-all))
(add-hook 'c-mode-common-hook 'my-cedet-hook)
(add-hook 'emacs-lisp-mode-hook 'my-cedet-hook)
(add-hook 'lisp-interaction-mode-hook 'my-cedet-hook)

(global-semantic-tag-folding-mode 1)

以及 CPP 测试文件:

#include <stdio.h>
#include <vector>
#include <string>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace cv;
using namespace std;

int main(int argc, char **argv)
{
  KeyPoint k;
  Mat m;

  // m should have members like m.clone()
  // k has members like k.pt (Point2f pt)

  return 0;
}
于 2012-01-31T06:06:54.760 回答
3

看起来,语义解析器无法解析类声明——它认为它CV_EXPORTS Mat不是它Mat本身,尽管CV_EXPORTS应该扩展为空字符串。我使用了以下配置,它适用于 C 代码,但不适用于 C++。我建议您写信给 cedet-devel 邮件列表并附上示例 - 只需写在那里,如有必要,我会为您的邮件提供更多评论...

(ede-cpp-root-project "OpenCV/C++ test"
     :name "OpenCV/C++ test"
     :file "/Users/ott/development/opencv-examples/cpp/CMakeLists.txt"
     :include-path '("/"
                  )
     :system-include-path '("/opt/local/include"
                     "/opt/local/include/opencv"
                     "/opt/local/include/opencv2")
     :spp-table '(
                  ("CV_PROP_RW" . "")
                  ("CV_EXPORTS" . "")
                  ("CV_EXPORTS_W_SIMPLE" . "")
               ("CV_EXPORTS_W" . "")
               ("CV_EXPORTS_W_MAP" . "")
               ("CV_INLINE" . ""))
     :local-variables (list
               (cons 'semantic-lex-c-preprocessor-symbol-file
                 (cons "/opt/local/include/opencv2/core/types_c.h"
                   (cons "/opt/local/include/opencv2/imgproc/types_c.h"
                     semantic-lex-c-preprocessor-symbol-file)))))
于 2012-01-28T16:07:27.280 回答