EmergenceDoc.obj:错误LNK2019:未解析的外部符号 我在VS2010中创建了一个简单的MFC文本编辑器,以便学习C++,我碰到了一个绊脚石……

EmergenceDoc.obj:错误LNK2019:未解析的外部符号 我在VS2010中创建了一个简单的MFC文本编辑器,以便学习C++,我碰到了一个绊脚石……,c++,mfc,C++,Mfc,具体而言,我在生成日志中遇到以下错误: 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\D

具体而言,我在生成日志中遇到以下错误:

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 *)" (??0CEmergenceCntrItem@@QAE@PAU_reobject@@PAVCEmergenceDoc@@@Z) referenced in function "public: virtual class CRichEditCntrItem * __thiscall CEmergenceDoc::CreateClientItem(struct _reobject *)const " (?CreateClientItem@CEmergenceDoc@@UBEPAVCRichEditCntrItem@@PAU_reobject@@@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
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

任何帮助都将不胜感激。

只需将cntritem.cpp和cntritem.h复制到资源文件夹中即可

让编译器转储预处理文件,并查看在编译CEmergenceCntrItem的c'tor时REOBJECT的计算结果。通过指定编译器开关,可以指示MSC输出预处理文件。所有大写字母通常表示预处理器宏-它可能不是它看起来的样子。-再想一想:您的.cpp文件中的pragma看起来不正确。标题中缺少include-guard看起来也不对。CEmergenceCntrItemREOBJECT*preo=0,CEmergenceDoc*pContainer=0;所以我猜测REOBJECT evaluates为0,尽管我不确定这意味着什么……这不是预处理的输出;这是您的c'tor声明,带有默认参数。如果在调用中未提供指针,则将使用nullptr。这不是问题。我不知道如何获得预处理的输出。我尝试/P并查看生成的EmergenceDoc.I文件。
#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