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