【问题标题】:Header modifications do not take effect in fresh build标头修改在全新构建中不生效
【发布时间】:2016-06-22 09:46:25
【问题描述】:

我正在尝试将 OpenCV 3.1 中的简要描述符用于 Android。为了实现 OpenCV 必须使用 _contrib 从源代码构建。所以我编译它没有错误,还可以在命令窗口中看到BRIEF.cpp.obeeing。

所以当我尝试使用它时,我的 android 应用程序崩溃并抛出

OpenCV 错误:静态 cv::javaDescriptorExtractor* cv::javaDescriptorExtractor::create(int)、文件 /home/maksim/workspace/android-pack/opencv/ 中的参数错误(不支持指定的描述符提取器类型。)模块/features2d/misc/java/src/cpp/features2d_manual.hpp,第 374 行

所以我检查了 features2d_manual.hpp。第 374 行是 switch case 块的默认表达式:

CV_WRAP static javaDescriptorExtractor* create( int extractorType )
{
    //String name;

    if (extractorType > OPPONENTEXTRACTOR)
    {
        //name = "Opponent";
        extractorType -= OPPONENTEXTRACTOR;
    }

    Ptr<DescriptorExtractor> de;
    switch(extractorType)
    {
    //case SIFT:
    //    name = name + "SIFT";
    //    break;
    //case SURF:
    //    name = name + "SURF";
    //    break;
    case ORB:
        de = ORB::create();
        break;
    //case BRIEF:
    //    name = name + "BRIEF";
    //    break;
    case BRISK:
        de = BRISK::create();
        break;
    //case FREAK:
    //    name = name + "FREAK";
    //    break;
    case AKAZE:
        de = AKAZE::create();
        break;
    default: //**this is line 374**
        CV_Error( Error::StsBadArg, "Specified descriptor extractor type is not supported." );
        break;
    }

    return new javaDescriptorExtractor(de);

所以错误显然出现了,因为 case Brief 被注释了。所以我就这样修改了:

#include "opencv2/xfeatures2d.hpp"

。 . .

case BRIEF:
    de = xfeatures2d::BriefDescriptorExtractor::create();
    break;

。 . .

default:
            CV_Error( Error::StsBadArg, "---TEST--- Specified descriptor extractor type is not supported." );
            break;
        }

在新目录中重新构建并使用新构建后,完全相同的错误仍然存​​在。消息中甚至没有“---TEST---”。

所以我想知道为什么我的更改没有任何效果。

我也想知道为什么文件路径是:

/home/maksim/workspace/android-pack/opencv/modules/features2d/misc/java/src/cpp/features2d_manual.hpp

这个目录甚至在我的系统上都不存在,谷歌搜索显示,/home/maksim/ 是 android 上许多不同错误消息的一部分。

构建前的实际路径是:

C:\Users\JJG-CD\Desktop\Build_Workspace\opencv-3.1.0\modules\features2d\misc\java\src\cpp\features2d_manual.hpp

我希望有人能向我解释问题是什么,并最终给我一个提示如何解决它。

【问题讨论】:

    标签: java android c++ opencv


    【解决方案1】:

    您看到的错误几乎肯定来自您链接到的使用相同头文件的库。当您重新编译更改了标头的代码时,该标头更改仅对您实际编译的代码生效,而不是已经在您还链接的库中编译的代码。

    查看您的编译行并将所有-l 选项视为可能的嫌疑人。

    这也解释了不存在的目录引用:该目录存在并在库本身在编译它们的任何机器上编译时使用。

    如果您希望您的标头更改在库代码中生效,则需要重新编译库本身。查看您的项目配置文件:您可能已经有makecmake 选项来执行此操作。

    【讨论】:

    • 感谢您回答 Smeeheey。我想给你一个 1up,但我没有足够的声誉(也许其他人可以为我做)你的 cmets 对我的问题有所了解。我在 win7 和 cmake-gui 上编译,但我仍然可能找到了可以解决它的选项。除了一些选项之外,我确切知道我需要更改我一直在使用默认设置进行编译 - 其中之一:ENABLE_PRECOMPILED_HEADERS = true。所以我将它设置为 false 并再试一次。有结果我会第一时间更新的。
    • ENABLE_PRECOMPILED_HEADERS = false 没有帮助 - 仍然是同样的问题。除此之外,我不知道还有什么可以改变的。似乎这是一个错误,一年前已经报告过:link。作为一个新手程序员,我想我必须放弃这个
    • 你为什么不分享你的确切编译行?如果您使用的是make或cmake,请分享相关的makefile
    • 我不完全确定,相关的 makefile 是什么文件,因为在我的构建目录中有一大堆文件。但我认为您要求的是所选选项创建的配置摘要 - 所以我想这是最接近的:link
    【解决方案2】:

    我已经放弃了,但偶然找到了解决方案。我自己构建的库没有被使用的原因是这些库通常由 opencv 管理器应用程序提供。为了摆脱 OpenCV 管理器并使用我自己的库,我只需要静态初始化 OpenCV。

    static {
    if (!OpenCVLoader.initDebug()) {
        // Handle initialization error}
    }
    

    更多详情可查看here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-27
      • 1970-01-01
      • 1970-01-01
      • 2019-10-27
      • 2015-11-05
      • 1970-01-01
      相关资源
      最近更新 更多