神秘的"undefined reference"链接器错误

Mysterious "undefined reference" linker errors

本文关键字:链接 错误 reference undefined      更新时间:2023-10-16

对于一个大学项目,我正在为Android做一个手跟踪算法端口。代数。主要使用OpenCV函数。老实说,我真的不明白代数是什么。是的,但这不是我的问题。所以移植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或设置类似nPointsCoonnected=1的值会使链接器错误消失。

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

编辑这是环绕码:

 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 );
        }
    }

这看起来就像是您最终从-lopencv_legacy中拉入了compat.o对象文件,并且这个文件委托给了另一个实现。也就是说,您可能需要在-lopencv_legacy之后指定-lopencv

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

只是澄清一下,因为这里的一些人认为问题不是导致这个错误的递增整数。此外,它是if条件中的方法调用

(nPointsConnected > SOMEVALUE)

我所要做的是更改OpenCV生成文件中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邮件列表中指出这一点的人)