无法管理链接cpp文件 - 未解析的外部符号

时间:2013-12-02 12:05:45

标签: c++ visual-studio-2008 linkage

我正在使用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)前缀)。这表明问题,不是吗?

1 个答案:

答案 0 :(得分:1)

好吧,我发现了问题,它与__declspec(dllimport)无关。

我在同一个项目中定义的其他类中调用了func2。 此调用生成错误。当我评论电话时,问题就消失了。 func2的其中一个参数是CString& str。显然MFC未在包含调用func2的第一个项目的lib的其他项目中使用,因此我无法使用CString

将其更改为std:string解决问题。

我仍然不明白的一件事是我收到此错误而不是实际表明问题的错误。您可以在错误代码中看到func2ArgumentsToInApiString,但仍然没有任何迹象表明Cstring未知。