【问题标题】:Linking Rob Hess's SIFT library (in C, using OpenCV) with C++将 Rob Hess 的 SIFT 库(在 C 中,使用 OpenCV)与 C++ 链接
【发布时间】:2011-12-27 12:28:58
【问题描述】:

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

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

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

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

  • withouth extern: 因为 C++ 名称修改而无法工作(我已经检查过了,当然所有的函数名称都被修饰了)

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

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

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

【问题讨论】:

    标签: c++ c opencv linkage sift


    【解决方案1】:

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

    简单:

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

    优雅

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

    // OpenCV includes:
    #include "cxcore.h"
    #include ....
    
    #if __cplusplus
    extern "C" {
    #endif
    
    ...
    function definitions in the header file
    ...
    
    #if __cplusplus
    }
    #endif
    

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

    【讨论】:

    • 看起来我不能再接受我自己的答案 2 天,但这解决了问题,我会尽快接受我的答案。希望这对其他人有帮助:)
    猜你喜欢
    • 2017-04-08
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-03
    • 2014-02-08
    相关资源
    最近更新 更多