1

プロジェクトで C 言語と OpenCV ライブラリを使用してプログラムを作成する必要があるため、このサイトの MACOSX のインストールに関するガイドに従いました: OpenCV インストール

インストールには 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

4

1 に答える 1

2

「未定義のシンボル」とは、適切なライブラリにリンクしていないか、リンクしているがライブラリが間違ったアーキテクチャ用であることを意味します (たとえば、マシンが 64 ビットであるのに 32 ビット ライブラリ)。

リンク フラグとパス、およびライブラリのインストール パスを確認する必要があります。

Eclipse でリンカー ログ、および/またはリンカーに渡されたコマンド ラインを取得できる場合は、ターミナルからリンク コマンドを繰り返し、より役立つメッセージ (「ライブラリが見つかりません」など) が表示されるかどうかを確認できます。 . またはmake、ターミナルからコマンドを実行して、同じことを試すこともできます。

Makefile を編集すると、一部のコマンドの先頭に「@」記号が追加されていることがわかります。これにより、コマンドが出力されなくなります (出力は表示されますが、コマンド自体は表示されません)。通常、@ を安全に削除して、より詳細な出力を得ることができます。

もう 1 つの可能性は、名前マングリング エラーがあり、関数の "_" プレフィックスが存在しないことです。私は Eclipse にあまり詳しくないので、そこについていくことはできません。ただし、たとえばhttp://www.eclipse.org/forums/index.php/m/783606/を参照してください。間違ったオプションで OpenCV をビルドした可能性があるため、コードと互換性がなくなりました。他の OpenCV 関数を問題なく呼び出す方法を考えると、これは奇妙です。しかし、OpenCV を 2 つのステップでビルドしたのでしょうか?

一般に (これは 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

これで、次の 2 つの重要なことがわかりました。

  1. シンボルは実際にはと呼ばれcvCalcOpticalFlowFarnebackます。あなたのGCCは、アンダースコア付きのシンボルが見つからないと不平を言ってい_cvCalcOpticalFlowFarnebackます。ライブラリのビルドが間違っているか、-fno-leading-underscoreGCC のオプションがありません。

しかし、その場合、OpenCV2 シンボルはまったく認識されません。だから、私は#2に賭けています:

  1. シンボルはlibopencv_video.so.2.4.3にあり、ビルド コマンドでそのライブラリへの参照はありません! -lopencv_video.2.4.3またはそのようなものが必要ですmakefile とオプションを確認します。

それがどうなるか教えてください-そしてボッカ・アル・ルポで

于 2013-01-05T17:34:09.837 に答える