0

我在链接 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";
    }
};

有没有人知道发生了什么事?


@克拉茨

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

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

Dependency Walker 给了我以下错误:

错误:由于隐式依赖模块中缺少导出函数,至少一个模块具有未解析的导入。

错误:发现具有不同 CPU 类型的模块。

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

警告:由于延迟加载依赖模块中缺少导出功能,至少有一个模块存在未解析的导入。

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

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

“延迟加载依赖模块”不是我最擅长的领域,所以我在这里几乎不知所措。我了解它们的一般概念,但我不明白这种情况的含义。谁能解释发生了什么以及如何解决问题?

4

0 回答 0