Связывание C++CLI-проектов приводит к неразрешенным токенам и внешним объектам.
У меня возникают трудности при связывании проектов 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.
Зависимость Уокер выдает мне следующие ошибки:
Ошибка: по крайней мере один модуль имеет неразрешенный импорт из-за отсутствия функции экспорта в неявно зависимом модуле.
Ошибка: были найдены модули с разными типами ЦП.
Предупреждение. По крайней мере один модуль зависимости задержки и загрузки не найден.
Предупреждение: по крайней мере один модуль имеет неразрешенный импорт из-за отсутствия функции экспорта в модуле, зависящем от задержки загрузки.
Первая ошибка говорит мне, что есть неразрешенные токены / внешние элементы (которые мы уже знаем по ошибкам в компиляторе).
Все мои проекты используют один и тот же тип платформы, поэтому я не уверен, почему я получаю вторую ошибку. Есть идеи?
"Модули зависимостей с задержкой загрузки" - не самая сильная моя область, поэтому я в значительной степени растерялся. Я получил общее представление о них, но я не понимаю смысл этого сценария. Может кто-нибудь объяснить, что происходит и как я могу решить проблему?