Я создаю простой текстовый редактор MFC в VS2010, чтобы узнать C++, и я попал немного камнем преткновения ....EmergenceDoc.obj: ошибка LNK2019: неразрешенный внешний символ
В частности, Я получаю следующее сообщение об ошибке в моем журнале сборки:
1> Generating Code...
1>Link:
1> Creating library C:\Users\Alvin\Documents\Visual Studio 2010\Projects\Emergence\Debug\EmergenceHandlers.lib and object C:\Users\Alvin\Documents\Visual Studio 2010\Projects\Emergence\Debug\EmergenceHandlers.exp
1>EmergenceDoc.obj : error LNK2019: unresolved external symbol "public: __thiscall CEmergenceCntrItem::CEmergenceCntrItem(struct _reobject *,class CEmergenceDoc *)" ([email protected]@[email protected][email protected]@[email protected]@@Z) referenced in function "public: virtual class CRichEditCntrItem * __thiscall CEmergenceDoc::CreateClientItem(struct _reobject *)const " ([email protected]@@[email protected]@[email protected]@@Z)
1>C:\Users\Alvin\Documents\Visual Studio 2010\Projects\Emergence\Debug\EmergenceHandlers.dll : fatal error LNK1120: 1 unresolved externals
1>
1>Build FAILED.
1>
1>Time Elapsed 00:00:06.52
========== Rebuild All: 1 succeeded, 1 failed, 0 skipped ==========
Ниже перечислены все файлы, в которых появляется CEmergenceCntrItem ....
cntritem.h:
#include "afxrich.h"
#include "Resource.h"
class CEmergenceDoc;
class CEmergenceView;
class CEmergenceCntrItem : public CRichEditCntrItem
{
DECLARE_SERIAL(CEmergenceCntrItem)
public:
CEmergenceCntrItem(REOBJECT* preo = NULL, CEmergenceDoc* pContainer = NULL);
public:
CEmergenceDoc* GetDocument()
{ return (CEmergenceDoc*)COleClientItem::GetDocument(); }
CEmergenceView* GetActiveView()
{ return (CEmergenceView*)COleClientItem::GetActiveView(); }
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CWordPadCntrItem)
public:
protected:
//}}AFX_VIRTUAL
// Implementation
public:
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
};
EmergenceView.cpp:
#include "afxrich.h"
#pragma once
class CEmergenceCntrItem;
class CEmergenceView : public CRichEditView
{
protected: // create from serialization only
CEmergenceView();
DECLARE_DYNCREATE(CEmergenceView)
public:
CEmergenceDoc* GetDocument() const;
public:
public:
virtual void OnDraw(CDC* pDC); // overridden to draw this view
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
public:
virtual ~CEmergenceView();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
protected:
afx_msg void OnFilePrintPreview();
afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnMutateGroup();
};
#ifndef _DEBUG // debug version in EmergenceView.cpp
inline CEmergenceDoc* CEmergenceView::GetDocument() const
{ return reinterpret_cast<CEmergenceDoc*>(m_pDocument); }
#endif
EmergenceDoc.cpp
#include "stdafx.h"
#include "Emergence.h"
#include "EmergenceDoc.h"
#include "CntrItem.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
IMPLEMENT_DYNCREATE(CEmergenceDoc, CRichEditDoc)
BEGIN_MESSAGE_MAP(CEmergenceDoc, CRichEditDoc)
//{{AFX_MSG_MAP(CMyWordDoc)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
// Enable default OLE container implementation
ON_UPDATE_COMMAND_UI(ID_OLE_EDIT_LINKS,
CRichEditDoc::OnUpdateEditLinksMenu)
ON_COMMAND(ID_OLE_EDIT_LINKS, CRichEditDoc::OnEditLinks)
ON_UPDATE_COMMAND_UI_RANGE(ID_OLE_VERB_FIRST,
ID_OLE_VERB_LAST, CRichEditDoc::OnUpdateObjectVerbMenu)
END_MESSAGE_MAP()
CEmergenceDoc::CEmergenceDoc()
{
}
CEmergenceDoc::~CEmergenceDoc()
{
}
BOOL CEmergenceDoc::OnNewDocument()
{
if (!CRichEditDoc::OnNewDocument())
return FALSE;
return TRUE;
}
CRichEditCntrItem* CEmergenceDoc::CreateClientItem(REOBJECT* preo) const
{
return new CEmergenceCntrItem(preo, (CEmergenceDoc*) this);
}
void CEmergenceDoc::Serialize(CArchive& ar)
{
CRichEditDoc::Serialize(ar);
}
CntrItem.cpp
#include "stdafx.h"
#include "Emergence.h"
#include "EmergenceDoc.h"
#include "EmergenceView.h"
#include "cntritem.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
IMPLEMENT_SERIAL(CEmergenceCntrItem, CRichEditCntrItem, 0)
CEmergenceCntrItem::CEmergenceCntrItem(REOBJECT *preo, CEmergenceDoc* pContainer)
: CRichEditCntrItem(preo, pContainer)
{
}
#ifdef _DEBUG
void CEmergenceCntrItem::AssertValid() const
{
CRichEditCntrItem::AssertValid();
}
void CEmergenceCntrItem::Dump(CDumpContext& dc) const
{
CRichEditCntrItem::Dump(dc);
}
#endif
Любая помощь будет принята с благодарностью.
Имейте файлы обработанных файлов для компилятора и посмотрите, что оценивает 'REOBJECT' при компиляции c'tor' CEmergenceCntrItem'. Вы можете указать MSC для вывода предварительно обработанных файлов, указав компилятор [/ P (Preprocess to the File)] (http://msdn.microsoft.com/en-us/library/8z9z0bx6.aspx). ALL UPPERCASE обычно указывает макрос препроцессора - возможно, это не так, как выглядит. - С другой мыслью: «#pragma once» в вашем .cpp-файле выглядит неправильно. Отсутствие включения охранников в ваш заголовок тоже не выглядит правильным. – IInspectable
CEmergenceCntrItem (REOBJECT * preo = 0, CEmergenceDoc * pContainer = 0); – pintee
, так что я предполагаю, что REOBJECT evauluates до 0, хотя я не уверен, что это значит ..... – pintee