我正在使用Visual Studio2008。我有一个很少有项目的解决方案。在一个项目(我们称其为ProjectX)中,我具有以下文件:
头文件(ExportProject.h)如下所示:
#ifndef __CExportProject_H_INCLUDED__
#define __CExportProject_H_INCLUDED__
class __declspec(dllimport) CExportProject{
string func1(... params1 ...);
void func2(... params2 ...);
}
#endif
和一个cpp文件(ExportProject.cpp):
#include "ExportProject.h"
string CExportProject::func1(... params1 ...){
...
return "some string";
}
void CExportProject::func2(){
string str = func1(... params ...);
}
当我单独编译ProjectX时,没有问题。当我尝试编译包含ProjectX和其他项目的解决方案时,出现此错误:(其中包含函数的真实名称,我只是将它们重命名以使问题更清楚)
PageWorkspace.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: void __thiscall CExportProject::ArgumentsToInApiString(class CInApiHash *,class ATL::CStringT<char,class StrTraitMFC_DLL<char,class ATL::ChTraitsCRT<char> > > &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class CArgumentsCollection const *,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (__imp_?ArgumentsToInApiString@CExportProject@@QAEXPAVCInApiHash@@AAV?$CStringT@DV?$StrTraitMFC_DLL@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@PBVCArgumentsCollection@23@2@Z) referenced in function "protected: void __thiscall CWorkspacePage::OnExportAsInApi(void)" (?OnExportAsInApi@CWorkspacePage@@IAEXXZ)
显然,这是一个联系问题。只是为了确保我尝试将实现移至标头即可。
另外,当我在func2
函数中的cpp文件上时,我确实在调用上单击鼠标右键,func1
然后选择“转到定义”,它将带我到头文件上的声明而不是cpp中的定义。
可能是什么原因?
更新
就像我之前说过的,当实现被移到头文件时,我将__declspec(dllimport)
其删除。使用__declspec(dllimport)
它不起作用(Hans Passant在评论中解释了原因)。
但是即使没有__declspec(dllimport)
实现在cpp上,我也会遇到相同的错误(当然,错误代码中没有__declspec(dllimport)前缀)。那说明问题了,不是吗?
好吧,我发现了问题,并且与无关__declspec(dllimport)
。
我正在调用func2
同一项目中定义的其他一些类。该调用产生了错误。当我对通话进行评论时,问题就消失了。的参数之一func2
是CString& str
。显然MFC
没有在其他Project中使用它,其中包括func2
被调用的第一个项目的lib ,所以我不能使用CString
。
更改它以std:string
解决问题。
我仍然不明白的一件事是为什么我收到此错误,而不是实际上指示问题的错误。的func2
是ArgumentsToInApiString
,你可以在错误代码看,但仍没有表明CString的是不知道的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句