由于VC9编译器符号名称不匹配导致未解析的外部符号

时间:2012-03-28 20:47:47

标签: c++ visual-studio-2008 visual-c++ linker-errors symbols

尝试链接时,我看到以下错误消息 一个项目中的库与另一个项目中的库在同一解决方案中:

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

在我链接的静态库上使用'dumpbin / symbols' 反对'GetField'方法显示不同的符号:

?GetField@MPADOFieldList@@QAEJPA_WPAPAUADOField@@@Z (public: long __thiscall MPADOFieldList::GetField(wchar_t *,struct ADOField * *))

显然,差异是'Field'与'ADOField'。 'Field'已定义 在引用的标题中:

typedef interface ADOField Field;

'GetField'方法的声明如下:

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

1 个答案:

答案 0 :(得分:1)

这几乎可以肯定是两件事之一,因为typedef是有条件的,而对于lib,它需要一个分支,而在主项目中需要另一个分支。但是,由于类型在主项目中解析Field,我有一个更合理的理论。包含GetField声明的标头具有Field的前向声明,但是在此TU中根本看不到typedef因此它被假定为将在别处定义的类型(导致第一个链接) )。但是在库中,可以看到typedef并将其正确解析为ADOField,从而导致不匹配。解决方案是确保在包含CCPTemplate::GetRootStorage定义的TU中看到typedef。