我在链接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类型的模块。
警告:找不到至少一个延迟加载依赖模块。
警告:由于延迟加载相关模块中的导出功能缺失,至少有一个模块具有未解析的导入。
第一个错误告诉我有未解析的令牌/外部(我们已经从编译器中的错误中知道)。
我的所有项目都使用相同的平台类型,因此我不确定为什么会出现第二个错误。有什么想法吗?
“延迟加载依赖模块”不是我最强的区域,所以我在这里几乎不知所措。我得到了它们的一般概念,但我不明白这种情况的含义。任何人都可以解释最新情况以及如何解决这个问题吗?