【问题标题】:Build Error with CalcOpticalFlowFarneback Function -> OpenCV -> C Language - Eclipse -> MacOSX使用 CalcOpticalFlowFarneback 函数构建错误 -> OpenCV -> C 语言 - Eclipse -> MacOSX
【发布时间】:2012-12-19 21:53:26
【问题描述】:

我必须为一个项目使用 C 语言和 OpenCV 库编写程序, 我按照此站点上的 MACOSX 安装指南进行操作: OpenCV Installation

我使用 Mac Port 进行安装。

我使用 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

【问题讨论】:

    标签: c eclipse macos opencv opticalflow


    【解决方案1】:

    “未定义符号”表示您没有链接到正确的库,或者您已经链接到了正确的库,但该库用于错误的体系结构(例如,您的机器是 64 位的 32 位库)。

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

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

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

    另一种可能性是存在名称修改错误,并且函数的“_”前缀不应该存在。不过,我对 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

    【讨论】:

    • 我使用了这个命令行 > sudo port install opencv 在 64 位中构建 OpenCV 2.1.0。我在项目属性上指定了正确的路径 opt/local/lib 和每个特定的库:opencv_gpu.2.4.3 所以我的意思是怎么了?我不明白.. opencv_core.2.4.3 opencv_highgui.2.4.3 opencv_imgproc.2.4.3
    • 我也不知道:cvCalcOpticalFlowFarneback 确实在库中。编辑答案。
    • 我尝试使用终端进行编译,结果如下: MacBook-Pro-di-emanuele:cattura_foto2 emanuelegragnoli$ 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 架构 x86_64 的未定义符号:“_cvCalcOpticalFlowFarneback”,引用自:ccYUFnom.o 中的 _main ld:未找到架构 x86_64 collect2 的符号:ld 返回 1 个退出状态
    • 我想我们可能已经发现了问题(实际上,我应该早点这样做)。我在答案中包含了针对这些情况的一般故障排除程序。
    猜你喜欢
    • 2014-05-23
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多