簡體   English   中英

神秘的“未定義參考”鏈接器錯誤

[英]Mysterious “undefined reference” linker errors

對於一個大學項目,我正在為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或設置類似nPointsConnected = 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之后指定-lopencv_legacy

我對Android或OpenCV一無所知,但這是錯誤消息的樣子。 除非nPointsConnected是某種類類型,否則對導致問題的原因的描述看起來有些奇怪。 在這種情況下,可能是增量運算符僅在兼容性庫中實現,而其他操作在“實際”實現中可用。 在目標文件上使用nm ,您可以找到導致更改的未定義的其他符號,然后查看它們在哪個庫中定義。

只是為了澄清一下,因為這里的某些人認為問題不是導致此錯誤的遞增整數。 此外,它是在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郵件列表的人指出了這一點)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM