Таинственные ошибки "неопределенной ссылки" - PullRequest
0 голосов
/ 06 января 2012

для университетского проекта. Я делаю порт алгоритма ручного отслеживания для 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 ]

1 голос
/ 06 января 2012

Это выглядит так, как будто вы в конечном итоге извлекаете объектный файл compat.o из -lopencv_legacy и как будто этот файл делегируется другой реализации.То есть вам, вероятно, нужно указать -lopencv после -lopencv_legacy.

Я ничего не знаю об Android или OpenCV, но именно так выглядят сообщения об ошибках.Ваше описание причины проблемы выглядит немного странно, если только nPointsConnected не является классом.В этом случае может случиться так, что оператор приращения реализован только в библиотеке совместимости, в то время как другие операции доступны в «реальной» реализации.Используя nm в вашем объектном файле, вы можете найти, какие дополнительные символы, которые вы изменили, стали неопределенными, а затем посмотреть, в какой библиотеке они определены.

0 голосов
/ 08 января 2012

Просто для пояснения, поскольку некоторые люди здесь предполагали, что проблема не в увеличении целого числа, вызывающего эту ошибку.Кроме того, это был вызов метода в условии if

(nPointsConnected > SOMEVALUE)

. Мне нужно было изменить порядок модулей OpenCV в make-файле 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, который указал на это)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...