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



我必须为一个项目使用C语言和OpenCV库做一个程序,我在这个网站上遵循MACOSX的安装指南:OpenCV安装

我使用Mac端口进行安装。

我用Eclipse编程,现在,当我尝试编译这个程序,我得到一个构建错误,我认为这取决于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

"undefined symbol"意味着你没有链接到正确的库,或者你有,但库是针对错误的架构(例如,一个32位的库,而你的机器是64位的)。

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

如果您可以在Eclipse中获得链接器日志,和/或传递给链接器的命令行,则可以从终端重复链接命令,并查看是否得到更有用的消息(例如"library not found")。或者您可以尝试从终端运行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选项。

但是如果是这样的话,没有OpenCV2符号将被识别。所以,我赌#2:

  1. 符号在libopencv_video.so.2.4.3中,并且在构建命令中没有对该库的引用!您应该有-lopencv_video.2.4.3或类似的东西。验证你的makefile和选项。

让我知道进展如何-和在bocca al lupo

相关内容

  • 没有找到相关文章

最新更新