2012-01-05 5 views
0

大学のプロジェクトのために私はAndroidのハンドリングアルゴリズムのポートをやっています。アルグ。主にOpenCV関数を使用します。正直なところ、私は本当にその仲間が何かを理解していない。これは私の問題ではありません。 したがって、algを移植します。私は作業中のWindowsのビジュアルスタジオプロジェクトからアンドロイドプロジェクトにすべてのファイルを追加し、いくつかのコンパイラの警告とエラーをこことそこで修正しました。主に成功しました... 不幸なことに、何時間も心配しているファイルが1つあります。このファイルをコンパイルする は、次のエラーをスローします:不思議な "未定義のリファレンス"リンカのエラー

./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をデクリメントまたは= 1 nPointsConnectedのような値を設定することであるということですリンカーのエラーが消えます。

プロジェクトには、同じ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); 
     } 
    } 
+0

あなたは正しいバージョンのCVを使っていないと思います。この質問をC +°+タグで試してください。 – Snicolas

+0

このプロジェクトは、実際のOpenCVサンプルプロジェクトに基づいているため、私はそうは思わないです。 – crizztus

+0

あなたのコードを問題のある行の周りに少しでも投稿できますか? –

答えて

1

あなたは-lopencv_legacyからcompat.oオブジェクト・ファイルに引っ張ってしまったし、別の実装にこのファイルを委譲しているかのようかのように見えます。つまり、おそらく-lopencv_legacyの後に-lopencvを指定する必要があります。

私はAndroidまたはOpenCVについて何も知らないが、これはエラーメッセージの表示方法です。 nPointsConnectedが何らかのクラスタイプでない限り、問題の原因となった説明がちょっと変わっています。この場合、増分演算子は互換性ライブラリでのみ実装され、他の演算は「実際の」実装で使用可能な場合があります。あなたのオブジェクトファイルにnmを使用すると、変更された追加のシンボルが見つからず、定義されていないライブラリが表示されます。

+0

こんにちは、あなたの提案に感謝します。 nPointsDisconnectedは単純な整数です。 – crizztus

+0

どのファイルにnmが適用されますか? – crizztus

+0

オブジェクトファイル(.o)、ライブラリ(.a)、共有ライブラリ(.so)、および実行可能ファイルのバイナリで動作します。私はシンボル情報を書きます。私は通常、 "nm -po foo.o | less"のように使います。 "U"文字は未定義シンボル、他のシンボルは異なる種類の定義です。変更前後の記号を取得すると、新しく定義されていない記号が示されます。これらをC++ filtに送信すると、C++の見た目がわかるはずです(通常は[return]型なし) –

0

ここでは、このエラーの原因となった整数が増分されていないと仮定している人もいます。 さらに、それは内のメソッド呼び出しがいた場合、私は

OPENCV_MODULES := contrib legacy objdetect calib3d features2d video highgui imgproc ml flann core 

OPENCV_MODULES := contrib calib3d objdetect features2d video imgproc highgui ml legacy flann core ts 

からOpenCVのメイクファイル でOpenCVのモジュールの順序を変更してしなければならなかった何を条件

(nPointsConnected > SOMEVALUE) 

ここで、レガシーモジュールは置き換えられるモジュールです。 (これを指摘してくれたandroid-opencvメーリングリストの人のおかげです)

関連する問題