2

我正在尝试在我的 C++ 项目中使用Rob Hess 的 SIFT 库。我已经查看了其他 SIFT 实现的(代码),但是这个似乎最像 Lowe 的原始论文一样分阶段,并且还使用了我熟悉的 OpenCV,所以我选择了这个。

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

我已经尝试在有和没有围绕 C 库 include-s 的情况下编译我的代码extern,但都不起作用。我想我已经诊断出这两种情况的问题,但我不知道如何解决它们,我将非常感谢任何帮助。

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

  • withouth extern:由于 C++ 名称修改而不起作用(我已经检查过了,当然所有的函数名都被修饰了)

  • with extern: 不起作用,因为 OpenCV 可以检测为 C 或 C++ 编译的天气。任何 SIFT 库函数都没有链接问题,但现在 OpenCV 包含 C++ 头文件,并且由于在主程序中它最终包含在extern块中,因此我得到(字面上数百个)如下错误:

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

在过去的几天里,我一直在尝试完成这项工作,因此,如果有人尝试在 C++ 中使用相同的 SIFT 库,或者在使用不同的库时遇到类似问题,我们将不胜感激。

4

1 回答 1

3

看起来我已经设法找到了一个很好的解决方案。两种方式,简单而优雅:

简单的:

只需在包含所有 SIFT 库标头的部分之前包含库中使用的所有 OpenCV 标头(以及所需的任何其他 OpenCV 标头) 。extern "C"

优雅的

在所有库头文件中,围绕OpenCV 包含的extern "C"所有代码添加部分,如下所示:

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

#if __cplusplus
extern "C" {
#endif

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

#if __cplusplus
}
#endif

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

于 2011-12-27T18:33:23.917 回答