2

C++ プロジェクトでRob Hess の SIFT ライブラリを使用しようとしています。他の SIFT 実装 (のコード) も調べましたが、これは元の Lowe の論文のように最も段階的に分割されていて、私が慣れ親しんでいる OpenCV も使用しているように見えたので、これを選択しました。

残念ながら、C++ で使用して以来、問題が発生しただけです。ライブラリは、もともと OpenCV を使用して C で記述されています。

C ライブラリの include-s を で囲む場合としない場合の両方でコードをコンパイルしようとしましexternたが、どちらも機能しません。どちらの場合も問題が何であるかを診断したと思いますが、それらを解決する方法がわかりません。助けていただければ幸いです。

問題(または少なくとも、私が問題だと思うもの):

  • withouth extern: C++ の名前マングリングが原因で動作しません (私はチェックしましたが、もちろんすべての関数名は装飾されています)

  • with extern: OpenCV は C または C++ 用にコンパイルされた天気を検出できるため、機能しません。SIFT ライブラリ関数のいずれにもリンケージの問題はありませんが、現在 OpenCV には C++ ヘッダーが含まれており、メイン プログラムでは最終的にexternブロックに含まれているため、次のような (文字通り何百もの) エラーが発生します。

    /usr/local/include/opencv2/core/mat.hpp:2361: error: template with C linkage

私はこの数日間、これを機能させようとしてきたので、誰かが C++ で同じ SIFT ライブラリを使用しようとした場合、または別のライブラリで同様の問題を経験したことがある場合は、助けていただければ幸いです。

4

1 に答える 1

3

私はかなり素晴らしい解決策を見つけることができたようです。簡単でエレガントな 2 つの方法:

簡単:

すべての SIFT ライブラリ ヘッダーを含むセクションのに、ライブラリで使用されるすべての OpenCV ヘッダー (および必要なその他の OpenCV ヘッダー) を含めるだけです。extern "C"

エレガント

すべてのライブラリ ヘッダーで、次のように、OpenCV インクルードを除くextern "C"すべてのコードの周りにセクションを追加します。

// OpenCV includes:
#include "cxcore.h"
#include ....

#if __cplusplus
extern "C" {
#endif

...
function definitions in the header file
...

#if __cplusplus
}
#endif

現在、すべてのライブラリ インクルードは#includeextern "C". OpenCV ライブラリは C/C++ 用に正しくコンパイルされ (コンパイラによって異なります)、追加の OpenCV インクルードと SIFT ライブラリ インクルードの相対的な順序は関係ありません。

于 2011-12-27T18:33:23.917 に答える