这是我一直在寻找的错误,我一直试图弄清楚如何修复它但失败了。我在问是否有人可以指出我正确的方向。
WorldServer fatal error LNK1120: 2 unresolved externals
WorldServer error LNK2019: unresolved external symbol "public: class CItemElem * __thiscall CLinkedItemMgr::GetLinkedItem(unsigned long)" (?GetLinkedItem@CLinkedItemMgr@@QAEPAVCItemElem@@K@Z) referenced in function "private: void __thiscall CDPSrvr::OnLinkedItem(class CAr &,unsigned long,unsigned long,unsigned char *,unsigned long)" (?OnLinkedItem@CDPSrvr@@AAEXAAVCAr@@KKPAEK@Z)
WorldServer error LNK2019: unresolved external symbol "public: int __thiscall CLinkedItemMgr::AddLinkedItem(class CItemElem *)" (?AddLinkedItem@CLinkedItemMgr@@QAEHPAVCItemElem@@@Z) referenced in function "private: void __thiscall CDPSrvr::OnLinkedItem(class CAr &,unsigned long,unsigned long,unsigned char *,unsigned long)" (?OnLinkedItem@CDPSrvr@@AAEXAAVCAr@@KKPAEK@Z)
这是.h
#ifndef __ITEM_LINK__H
#define __ITEM_LINK__H
class CLinkedItemMgr
{
private:
CLinkedItemMgr(){ m_dwLinkedItemCount = 0;};
~CLinkedItemMgr(){};
DWORD m_dwLinkedItemCount;
public:
map<DWORD,CItemElem*> m_mapLinkedItems;
static CLinkedItemMgr *GetInstance()
{
static CLinkedItemMgr instance;
return &instance;
}
int AddLinkedItem(CItemElem *pItem);
CItemElem *GetLinkedItem(DWORD dwIndex);
};
#endif
这是.cpp
#include "stdafx.h"
#include "ItemLink.h"
int CLinkedItemMgr::AddLinkedItem(CItemElem *pItem)
{
if(!pItem)
return 0;
m_mapLinkedItems.insert(make_pair<DWORD,CItemElem*>(++m_dwLinkedItemCount,pItem));
return m_dwLinkedItemCount;
}
CItemElem *CLinkedItemMgr::GetLinkedItem(DWORD dwIndex)
{
map<DWORD,CItemElem*>::iterator it = m_mapLinkedItems.find(dwIndex);
if(it == m_mapLinkedItems.end())
return FALSE;
return it->second;
}
答案 0 :(得分:3)
你的问题出现在cpp中。
#ifdef __ITEM_LINK
#include "ItemLink.h"
#ifdef __ITEM_LINK
表示“仅在定义__ITEM_LINK
时才处理以下代码”
在您的情况下,未定义。它仅在包含"ItemLink.h"
时定义,并且"ItemLink.h"
仅在已定义时才包括在内。你已经阻止了先发生。
删除#ifdef
行。
答案 1 :(得分:0)
它看起来像一个链接问题。
编译器知道你的类有一个名为GetLinkedItem
的函数,但无法在任何地方找到该函数的任何定义。编译可执行文件时是否正确链接?
我打赌在链接之前停止编译器不会触发任何错误。
(例如g ++ -c ItemLink.cpp)。
我要求习惯视觉工作室的人帮忙详细说明:D 无论如何,编译需要三个主要步骤: 1)应用预处理器指令,解析源代码,查找语法错误等 2)从源代码创建目标文件(源代码和可执行文件之间的某个东西) 3)将构成项目的所有目标文件链接到一个可执行文件中
您的编译链在第三步失败。 编译器期望某些函数在某些.cpp中定义(在编译链的第2步已成为目标文件),但无法在任何地方找到它。
并且由于.cpp文件中的#ifdef而无法找到它,它告诉预处理器不要包含您的定义,因为__ITEM_LINK未定义
我看到你按照
的方式更改了问题中的.cpp