2011-12-27 126 views
2

我想在我的C++项目中使用Rob Hess's SIFT library。我已经查看了其他SIFT实现的代码,但是这个代码看起来像最初的Lowe的论文中最相似的,并且也使用了我熟悉的OpenCV,所以我选择了这个。用C++连接Rob Hess的SIFT库(用C语言,使用OpenCV)

不幸的是,自从我尝试在C++中使用它之后,我遇到了麻烦。该库最初是用OpenCV用C编写的。

我已经尝试编译我的代码,无论是否包含C库include -s都与extern,但都不起作用。我想我已经诊断出这两种情况下的问题,但我不知道如何解决这些问题,我非常感谢任何帮助。

问题(或者至少,我认为问题是):

  • withouth的extern:不,因为C的工作++名称重整(我检查了,当然,所有的功能名称被装饰)

  • extern:不起作用,因为OpenCV可以检测它为C或C++编译的天气。有任何的SIFT库函数没有联系的问题,但现在OpenCV中包括C++头,并且因为在主程序它最终包含在extern块,我得到(字面hundereds)像这样的错误:

    /usr/local/include/opencv2/core/mat.hpp:2361: error: template with C linkage

我一直在努力使这项工作的最后几天,所以如果有人试图用C++相同SIFT库工作或者已经经历过类似的问题,不同的图书馆,帮助将是最赞赏。

回答

3

看起来我设法找到了一个很好的解决方案。两种方式,轻松优雅:

简单:

就包括之前extern "C"部分,包括所有的SIFT库头在库(以及任何其他OpenCV头需要)使用的所有的OpenCV头。

优雅

在所有的库头,加上部分extern "C"周围所有的代码除了 OpenCV的包括,就像这样:

// OpenCV includes: 
#include "cxcore.h" 
#include .... 

#if __cplusplus 
extern "C" { 
#endif 

... 
function definitions in the header file 
... 

#if __cplusplus 
} 
#endif 

现在所有的库包括可以#include d直接在C++代码中没有extern "C"。 OpenCV库为C/C++编译正确(取决于编译器),并且附加的OpenCV包含的相对顺序和SIFT库包含的内容无关紧要。

+0

看起来我不能接受我自己的答案2天以上,但这解决了问题,我会尽快接受我的答案。希望这可以帮助别人:) – penelope 2011-12-27 18:35:08