2

64 ビット バージョンの Windows で 64 ビット バージョンの Visual Studio 2008 を使用しています。ライブラリ (OpenCV 2.1) にリンクするプロジェクトがあります。同じコンパイラを使用して、ソースから OpenCV をコンパイルしました。私の問題は、リリース モードとデバッグ モードの両方で発生します。

[プロパティ] ペインまたはプロジェクトで、ヘッダー ファイルを含むディレクトリを C/C++ -> [追加のインクルード ディレクトリ] の下に追加しました。.lib ファイルを含むディレクトリを [追加のライブラリ ディレクトリ] に追加し、ライブラリの名前を [リンカー] -> [入力] の下の [追加の依存関係] エントリに追加しました。

コンパイルしてリンクすると、次のようなエラーが発生します: error LNK2019: unresolved external symbol _cvFloodFill referenced in function "int __cdecl Label(class cvImage &)" (?Label@@YAHAAV?$cvImage@M@@@Z)

[リンカー] -> [コマンド ライン] -> [追加のオプション] の下に、/verbose:lib というタグを追加しました。コンパイラの出力ウィンドウに、関数を含むライブラリ (cv210d.lib) が検索されていることがわかります。(OpenCV のソースを調べたところ、問題の関数がこのライブラリで定義されていることがわかりました)

1>Linking...
1>Searching libraries
1> Searching C:\Program Files\OpenCV2.1\lib\cv210d.lib:

OpenCV ソースでは、問題の関数の宣言をラップする extern "C" 宣言があります。

ライブラリ ファイルで dumpbin /all を実行したところ、次のシンボルが定義されていることがわかりました。(Windows用のgnuツールチェーンがインストールされているので、grepを使用できます)。

C:\Program Files\OpenCV2.1\lib>dumpbin /all cv210d.lib | grep cvFloodFill
732B4 __imp_cvFloodFill
732B4 cvFloodFill
1CA __imp_cvFloodFill
1CA cvFloodFill

ご覧のとおり、リンカはシンボル _cvFloodFill を探していますが、それは定義されていません。cvFloodFill と __imp_cvFloodFill のみが定義されているため、ライブラリをコンパイルするときとライブラリにリンクしようとするときの名前マングリングが異なるというおかしなことが起こっているようです。

それが私が立ち往生しているところです。この情報を正しく解釈していますか? 名前マングリングに影響を与えるために何かする必要がありますか? ある種の異なるフラグを使用してライブラリをコンパイルする必要がありますか?

4

1 に答える 1

1

見つけた。(ウェブを検索したときにこのようなものが見つからなかったため、この問題を抱えている他の人の利益のために質問と回答を投稿しました)。

OpenCV をコンパイルしたとき、ソリューション プロパティの [構成プロパティ] -> [構成] で、すべてのプロジェクトのプラットフォームが x64 に設定されていました。

プロジェクトをコンパイルしたとき、プラットフォームは Win32 に設定されていました。答えは、[構成マネージャー] をクリックし、プロジェクトの [プラットフォーム] の下にある下向き矢印をクリックして、[新規] を選択し、[x64] を選択することでした。

これで、プロジェクトと OpenCV が同じプラットフォーム用にコンパイルされ、すべてが正しくリンクおよび実行されます。

于 2010-11-09T18:35:05.747 に答える