2012-03-28 7 views
2

同じソリューション内の別のに対して、一つのプロジェクトでライブラリ:「DUMPBIN /シンボルを使用して未解決の外部シンボルVC9コンパイラのシンボル名の不一致が原因 をリンクしようとしたとき、私は次のエラーメッセージを見ている

CPTemplate.obj : error LNK2019: unresolved external symbol "public: long __thiscall MPADOFieldList::GetField(wchar_t *,struct Field * *)" ([email protected]@@[email protected]@@Z) referenced in function "public: virtual long __stdcall CCPTemplate::GetRootStorage(struct IMPRootStore * *)" ([email protected]@@[email protected]@@Z) 

GetFieldの「私は反対 をリンクしています静的ライブラリには、のために異なるシンボルを明らかにする 『:ADOField『『対』フィールド』メソッドを

[email protected]@@[email protected]@@Z (public: long __thiscall MPADOFieldList::GetField(wchar_t *,struct ADOField * *)) 

明らかに違いがあります』。 「フィールドは、」参照ヘッダ内 定義される:

typedef interface ADOField Field; 

次のように「GetFieldの」メソッドの宣言がある:

HRESULT GetField(BSTR bstrFieldName, Field** rpField); 
+1

+1は完全なタグ付けに使用します。 – ildjarn

+0

ライブラリはバイナリと同じコンパイラでコンパイルされ、同じ設定を使用していますか(特にBSTR引数のためにここでの文字列処理を考えていますか? –

+0

同じコンパイラ、同じマシン、そして私が(cl.exeのVisual Studioの呼び出しから)同じ設定をすることができます。 – sctb

答えて

1

これはダウンの2つのいずれかにほぼ確実であり、eithertheのtypedef条件付きであり、libの場合は1つの分岐をとり、メインプロジェクトではもう一方の分岐をとります。しかし、タイプがメインプロジェクトのFieldを解決するので、私はもっと説得力のある理論を持っています。 GetField宣言を含むヘッダーにはFieldの前方宣言がありますが、typedefはこのTUではまったく見られませんので、他の場所で定義される型(最初のリンクを引き起こす)とみなされます。しかし、ライブラリではtypedefが見られ、正しく解決されてADOFieldになり、不一致が発生します。解決方法は、CCPTemplate::GetRootStorageの定義を含むTU内にtypedefがあることを確認することです。

+0

これは前方宣言ではなく、GetFieldを定義するヘッダをインクルードする前に、別のヘッダでインクルードされるADOライブラリの別のバージョンのように見えます。 – sctb

関連する問題