Visual Studio 2005 + MFC: ошибка компоновщика, невозможно связать с конструктором, даже если экспортирован - PullRequest
0 голосов
/ 04 августа 2011

У меня есть два проекта MFC, exe и dll.Exe ссылается на DLL.Я создал dll, извлекая некоторые классы из проекта exe, который был моей отправной точкой.

Сейчас dll собирается нормально, но exe не может связываться с конструктором одного из классов dll.Я попробовал __declspec (dllexport) для всего класса, но это дало мне слишком много предупреждений, поэтому я вместо этого __declspec (dllexport) отредактировал все его открытые члены.Это решило большинство ошибок ссылки, за исключением конструктора.

Ошибка (MsgBoxTest - это exe, CustomMessageBoxDlg - это dll):

MsgBoxTestDlg.obj : error LNK2019: unresolved external symbol "public: __thiscall CMessageBoxDialog::CMessageBoxDialog(class CWnd *,class ATL::CStringT<char,class StrTraitMFC<char,class ATL::ChTraitsCRT<char> > >,class ATL::CStringT<char,class StrTraitMFC<char,class ATL::ChTraitsCRT<char> > >,unsigned int,class CPoint,unsigned int)" (??0CMessageBoxDialog@@QAE@PAVCWnd@@V?$CStringT@DV?$StrTraitMFC@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@1IVCPoint@@I@Z) referenced in function "private: void __thiscall CMsgBoxTestDlg::OnDisplayMessageBox(void)" (?OnDisplayMessageBox@CMsgBoxTestDlg@@AAEXXZ)
1>Debug\MsgBoxTest.exe : fatal error LNK1120: 1 unresolved externals

Объявление конструктора (перегружено):

// Constructor of the class for direct providing of the message strings.
    __declspec(dllexport) CMessageBoxDialog ( CWnd* pParent, CString strMessage,
        CString strTitle = _T(""), UINT nStyle = MB_OK, CPoint initialPosition = CPoint(0,0), UINT nHelp = 0 );

    // Constructor of the class for loading the strings from the resources.
    __declspec(dllexport) CMessageBoxDialog ( CWnd* pParent, UINT nMessageID, UINT nTitleID = 0,
        UINT nStyle = MB_OK, CPoint initialPosition = CPoint(0,0), UINT nHelp = 0 );

Использование конструктора, на которое ссылается ошибка:

//this is a CMsgBoxTestDlg, m_strMessage and m_strTitle are CStrings, nStyle is an UINT, initialPosition is a CPoint
CMessageBoxDialog dlgMessageBox(this, m_strMessage, m_strTitle, nStyle, initialPosition);

Я пробовал Clean + Build, но без сигары

Редактировать : класс используетМакросы DECLARE_DYNAMIC и IMPLEMENT_DYNAMIC, а также расширение CDialog

1 Ответ

0 голосов
/ 04 августа 2011

Решено!Кажется, что CString разрешается к различным типам в зависимости от того, используете ли вы Unicode или многобайтовые символы в опциях вашего проекта (General-> Character Set).Моя dll использовала Unicode, а мой exe использовал Multi-Byte.Изменил dll, чтобы использовать MB, и он прекрасно работал.

...