我正在使用Visual Studio 2008.我有一个很少项目的解决方案。 在一个项目上(我们称之为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
的调用并选择“Go To Definition”,它会转到我的声明头文件而不是cpp中的定义。
可能是什么原因?
更新
正如我之前所说,当实现移动到标题并删除__declspec(dllimport)
时,它可以工作。使用__declspec(dllimport)
它不起作用(Hans Passant在comment中解释了原因。)
但即使没有__declspec(dllimport)
,当实现在cpp上时我也会得到相同的错误(当然在错误代码中没有__declspec(dllimport)前缀)。这表明问题,不是吗?
答案 0 :(得分:1)
好吧,我发现了问题,它与__declspec(dllimport)
无关。
我在同一个项目中定义的其他类中调用了func2
。
此调用生成错误。当我评论电话时,问题就消失了。
func2
的其中一个参数是CString& str
。显然MFC
未在包含调用func2
的第一个项目的lib的其他项目中使用,因此我无法使用CString
。
将其更改为std:string
解决问题。
我仍然不明白的一件事是我收到此错误而不是实际表明问题的错误。您可以在错误代码中看到func2
为ArgumentsToInApiString
,但仍然没有任何迹象表明Cstring未知。