链接C ++ CLI项目会导致未解析的令牌和外部

时间:2013-06-20 11:40:07

标签: mfc linker c++-cli clr unresolved-external

我在链接C ++ CLI项目时遇到了困难。

在我的一个CLR项目中,我有一个本机基类(包含托管方法和成员),我试图继承到另一个项目中的子类。编译器给出以下错误:

error LNK2028: unresolved token (0A0000CE) "protected: bool __thiscall CWpfTemplateDlg::SetIsCloseButtonEnabled(bool)" (?SetIsCloseButtonEnabled@CWpfTemplateDlg@@$$FIAE_N_N@Z) referenced in function "protected: virtual class System::Windows::Controls::UserControl ^ __clrcall CTestWpf::InitWpfContent(void)" (?InitWpfContent@CTestWpf@@$$FMAMP$AAVUserControl@Controls@Windows@System@@XZ)  B:\Trunk\Edison\ForetagsplatsenCLR\ForetagsplatsenCLR.obj   ForetagsplatsenCLR

error LNK2019: unresolved external symbol "protected: bool __thiscall CWpfTemplateDlg::SetIsCloseButtonEnabled(bool)" (?SetIsCloseButtonEnabled@CWpfTemplateDlg@@$$FIAE_N_N@Z) referenced in function "protected: virtual class System::Windows::Controls::UserControl ^ __clrcall CTestWpf::InitWpfContent(void)" (?InitWpfContent@CTestWpf@@$$FMAMP$AAVUserControl@Controls@Windows@System@@XZ)   B:\Trunk\Edison\ForetagsplatsenCLR\ForetagsplatsenCLR.obj   ForetagsplatsenCLR

包含基类的项目编译没有问题,生成.lib,.dll,.exp和.pdb文件。我通过在“公共属性”中创建引用,设置包含目录并在“配置属性 - >链接器 - >输入”中明确声明.lib文件来链接项目。

以下是代码:

// Header
class CWpfTemplateDlg abstract : public CDialog
{
public:
   CWpfTemplateDlg::CWpfTemplateDlg( CWnd* pParent ) :
      CDialog( IDD_WPF_TEMPLATE_DIALOG, NULL )
   {
   }
   virtual CWpfTemplateDlg::~CWpfTemplateDlg()
   {
   }    

protected:
   virtual std::string GetCaption() = 0;
   virtual System::Windows::Controls::UserControl^ InitWpfContent() = 0;
   bool SetIsCloseButtonEnabled( bool enabled );

private:
   DECLARE_MESSAGE_MAP()
   BOOL OnInitDialog();
   afx_msg BOOL OnHelpInfo( HELPINFO* pHelpInfo );

protected:
   HWND m_wpfChild;
   gcroot<System::Windows::Interop::HwndSource^> m_hwndSource;
   gcroot<System::Windows::Controls::UserControl^> m_wpfControl;
};



// Cpp
bool CWpfTemplateDlg::SetIsCloseButtonEnabled( bool enabled )
{
    ...
}

BOOL CWpfTemplateDlg::OnInitDialog()
{
    ...
}

BOOL CWpfTemplateDlg::OnHelpInfo( HELPINFO* pHelpInfo )
{
    return TRUE;
}

BEGIN_MESSAGE_MAP(CWpfTemplateDlg, CDialog)
    ON_WM_HELPINFO()
END_MESSAGE_MAP()

子类:

class CTestWpf : public CWpfTemplateDlg
{
public:
    CTestWpf( CWnd* pParent = NULL ) :
        CWpfTemplateDlg( pParent )
    {
    }

protected:
    System::Windows::Controls::UserControl^ InitWpfContent()
    {
        SetIsCloseButtonEnabled(false);
        System::Windows::Controls::UserControl^ wpfControl = nullptr;

        return wpfControl;
    }

    std::string GetCaption()
    {
        return "Caption";
    }
};

有没有人知道最近发生了什么?


@Kratz

是的,我确实添加了库路径。

/ VERBOSE不会出现与加载lib文件相关的任何错误。

Dependency Walker给出了以下错误:

  

错误:由于隐式相关模块中缺少导出功能,至少有一个模块具有未解析的导入。

     

错误:找到了具有不同CPU类型的模块。

     

警告:找不到至少一个延迟加载依赖模块。

     

警告:由于延迟加载相关模块中的导出功能缺失,至少有一个模块具有未解析的导入。

第一个错误告诉我有未解析的令牌/外部(我们已经从编译器中的错误中知道)。

我的所有项目都使用相同的平台类型,因此我不确定为什么会出现第二个错误。有什么想法吗?

“延迟加载依赖模块”不是我最强的区域,所以我在这里几乎不知所措。我得到了它们的一般概念,但我不明白这种情况的含义。任何人都可以解释最新情况以及如何解决这个问题吗?

0 个答案:

没有答案