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