神秘的“未定义引用”链接器错误

时间:2012-01-05 20:59:21

标签: android c++ android-ndk

对于一个大学项目我正在为Android做一个手动跟踪算法的端口。阿尔格。主要使用OpenCV功能。老实说,我真的不明白什么是alg。但这不是我的问题。 所以移植alg。我将工作windows visual studio项目中的每个文件添加到我的android项目中,修复了一些编译器警告和错误。大部分成功...... 不幸的是,有一个文件让我担心了很多个小时。 编译此文件会引发以下错误:

./obj/local/armeabi-v7a/libopencv_legacy.a(compat.o): In function `cvFindChessBoardCornerGuesses':
compat.cpp:(.text.cvFindChessBoardCornerGuesses+0x18): undefined reference to `cvFindChessboardCorners'
./obj/local/armeabi-v7a/libopencv_legacy.a(compat.o): In function `cvHoughLines':
compat.cpp:(.text.cvHoughLines+0x46): undefined reference to `cvHoughLines2'
./obj/local/armeabi-v7a/libopencv_legacy.a(compat.o): In function `cvHoughLinesSDiv':
compat.cpp:(.text.cvHoughLinesSDiv+0x54): undefined reference to `cvHoughLines2'
./obj/local/armeabi-v7a/libopencv_legacy.a(compat.o): In function `cvHoughLinesP':
compat.cpp:(.text.cvHoughLinesP+0x52): undefined reference to `cvHoughLines2'
./obj/local/armeabi-v7a/libopencv_legacy.a(compat.o): In function `cvCalcEMD':
compat.cpp:(.text.cvCalcEMD+0x44): undefined reference to `cvCalcEMD2'
collect2: ld returned 1 exit status

有趣的是,导致此错误的唯一行是

nPointsConnected ++;

注释此行或递减nPointsConnected或设置类似nPointsConnected = 1的值会使链接器错误消失。

项目中还有其他文件,包括相同的OpenCV头文件编译。 有人可以向我解释一下吗? 请...

EDIT 这是环绕码:

 if ( minK > FINGERTIP_ANGLE_THRESHOLD && minDir > 0 )
    {
        nPointsGap = 0;
        if ( nPointsConnected == 0 )
            {
                startIndex = i;
            }

        nPointsConnected ++;
        if ( minAngle < minK )
        {
            minAngle = minK;
            minPointIndex = i;
        }
        fConnected = true;
        mediumIndex += ( minK * i );
        meanPointX += ( minK * contour[i].x );
        meanPointY += ( minK * contour[i].y );
        sumAngle += minK;
        if ( fScreenshot )
        {
            cvCircle( pScreenshot_curvature, cvPoint(contour[i].x*2, contour[i].y*2),
                4, CV_RGB(255,255,0), -1, 8, 0 );
            cvCircle( pScreenshot_ellipse, cvPoint(contour[i].x*2, contour[i].y*2),
                4, CV_RGB(255,255,0), -1, 8, 0 );
        }
    }

2 个答案:

答案 0 :(得分:1)

这看起来好像你最终从compat.o引入了-lopencv_legacy目标文件,就像这个文件委托给另一个实现一样。也就是说,您可能需要在-lopencv之后指定-lopencv_legacy

我对Android或OpenCV一无所知,但这就是错误消息的样子。除非nPointsConnected是某种类类型,否则您对导致问题的原因的描述看起来有点奇怪。在这种情况下,增量运算符可能仅在兼容性库中实现,而其他操作在“实际”实现中可用。在目标文件上使用nm,您可以找到您更改的其他符号导致未定义,然后查看它们在哪个库中定义。

答案 1 :(得分:0)

只是为了澄清, 正如有些人认为问题不是增加的整数导致这个错误。 此外,它是if条件中的方法调用

(nPointsConnected > SOMEVALUE)

我要做的是改变OpenCV makefile中OpenCV模块的顺序 从

OPENCV_MODULES := contrib calib3d objdetect features2d video imgproc highgui ml legacy flann core ts

OPENCV_MODULES := contrib legacy objdetect calib3d features2d video highgui imgproc ml flann core

遗留模块是要替换的模块。 (非常感谢android-opencv邮件列表中指出这一点的人)