使用CalcOpticalFlowFarneback函数构建错误 - > OpenCV - > C语言 - Eclipse - > MacOSX的

时间:2013-01-05 17:31:42

标签: c eclipse macos opencv opticalflow

我必须使用C语言和OpenCV Libreries为一个项目做一个程序, 我按照本网站上的MACOSX安装指南进行了操作: OpenCV Installation

我使用Mac Port进行安装。

我用Eclipse编程, 现在当我尝试编译这个程序时,我得到一个Build Error,我认为它取决于CalcOpticalFlowFarneback()函数。

这是代码:

 #include <stdio.h>
    #include <cv.h>
    #include <highgui.h>
    #include <math.h>
    #include <time.h>


int main(){



    CvCapture* webcam = cvCreateCameraCapture(0);
    IplImage*prev=NULL;
    IplImage*next=NULL;
    char scelta;

    /*INIZIALIZZAZIONE FUNZIONE RAND*/

    srand(time(NULL));


    double pyr_scale=0.5; 
    int levels=1;
    int winsize=3; 
    int iterations=10;
    int poly_n=5; 
    double poly_sigma=1.1;
    int flags=0;

    sleep(2);

    if (!webcam){
    /* Exit with an error */
        puts("Attenzione! si è verificato un Errore in Fase di Attivazione della WebCam. Preghiamo di Riprovare!");
        return -1;
    }


    while (1) {

        prev = cvQueryFrame(webcam);//primi 8-bit single-channel immagine in ingresso
        next = cvQueryFrame(webcam);// immagine secondo ingresso della stessa dimensione e lo stesso tipo prev.

        CvSize isize = cvSize(80,80);
        IplImage *flow = cvCreateImage(isize, IPL_DEPTH_32F, 1); //immagine computerizzata che ha le stesse dimensioni e tipo CV_32FC2 prev
        if ((prev) && (next)) {



            cvCalcOpticalFlowFarneback(prev,next,flow,pyr_scale,levels,winsize,iterations,poly_n,poly_sigma,flags);

            scelta=cvWaitKey(20);
            if((char)scelta == 27){

                break;
            }


        }


    }

    cvDestroyWindow("VIDEO SORVEGLIANZA");
    cvReleaseCapture(&webcam);

    return 0;
}

这是错误日志:

Undefined symbols for architecture x86_64: "_cvCalcOpticalFlowFarneback", referenced from:_main in main.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make: *** [cattura_foto] Error 1

我想指定如果我删除cvCalcOpticalFlowFarneback函数我没有任何问题。

谢谢,

manu.web

1 个答案:

答案 0 :(得分:2)

“未定义的符号”表示您没有链接到正确的库,或者您有,但该库是针对错误的体系结构(例如,当您的计算机是64位时,32位库)。

您需要检查链接标志和路径以及库安装路径。

如果您可以在Eclipse中获取链接器日志,和/或传递给链接器的命令行,您可以从终端重复链接命令,看看您是否收到更有用的消息(例如“库不是找到“)。或者您可以尝试从终端运行make命令并执行相同的操作。

编辑Makefile,您可能会发现某些命令前面带有“@”符号,这会阻止它们输出(它们的输出是可见的,命令本身不是)。您通常可以安全地删除@并获得更详细的输出。

另一种可能性是存在名称错位错误,函数的“_”前缀不应该存在。我对Eclipse不太熟悉,所以我不能在那里关注你。但是请看例如http://www.eclipse.org/forums/index.php/m/783606/;您可能使用错误的选项构建OpenCV,因此现在它与您的代码不兼容。这很奇怪,看你如何称呼其他OpenCV函数没有问题;但也许你分两步建立了OpenCV?

一般情况下(这不仅限于OpenCV!),您将拥有一个构建命令,例如

gcc -I/usr/local/include/opencv -L/usr/local/lib main.c -o Cattura_foto2 \
-lopencv_core.2.4.3 \
-lopencv_imgproc.2.4.3 \
-lopencv_highgui.2.4.3 \
-lopencv_gpu.2.4.3

错误抱怨未定义的符号:

Undefined symbols for architecture x86_64: "_cvCalcOpticalFlowFarneback"

这意味着您正在链接库openvc_core.2.4.3等,并且链接器找不到符号“_cvCalcOpticalFlowFarneback”。

在您的计算机上找到这些库,并针对您找到的所有库运行(从终端)以下命令。 注意:您的路径可能会有所不同。我有/ usr / lib64

for lib in /usr/lib64/libopencv_*; do 
    echo "Examining $lib..."
    strings $lib | grep -i cvCalcOpticalFlowFarneback
done

你应该看到类似的东西:

Examining /usr/lib/libopencv_pippo_pluto...
Examining /usr/lib/libopencv_blah_blah...
...
Examining /usr/lib64/libopencv_video.so...
cvCalcOpticalFlowFarneback
cvCalcOpticalFlowFarneback
Examining /usr/lib64/libopencv_video.so.2.4...
cvCalcOpticalFlowFarneback
cvCalcOpticalFlowFarneback
Examining /usr/lib64/libopencv_video.so.2.4.3...
cvCalcOpticalFlowFarneback
cvCalcOpticalFlowFarneback

多次匹配的原因是库存在多个符号副本。

可以肯定的是,让我们检查一下图书馆:

nm -D /usr/lib64/libopencv_video.so.2.4 | grep Farneback

0000000000027e50 T cvCalcOpticalFlowFarneback

现在我们知道两件重要的事情:

  1. 符号真的称为cvCalcOpticalFlowFarneback。您的GCC抱怨它找不到带有下划线的符号_cvCalcOpticalFlowFarneback。您要么错误地构建了库,要么缺少GCC的-fno-leading-underscore选项。
  2. 但如果是这种情况,根本不会识别OpenCV2符号。所以,我打赌#2:

    1. 该符号位于 libopencv_video.so.2.4.3 中,并且您的构建命令中没有对该库的引用!你应该有 -lopencv_video.2.4.3 或类似的东西。验证您的makefile和选项。
    2. 让我知道它是怎么回事 - 而且在bocca al lupo