【问题标题】:Why am I getting this error ? "unresolved external symbol" [duplicate]为什么我会收到此错误? “未解决的外部符号” [重复]
【发布时间】:2013-03-19 10:44:09
【问题描述】:

这是我一直遇到的错误,我一直在尝试找出解决方法,但失败了。我在问是否有人可以指出我正确的方向。

 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;
}

【问题讨论】:

标签: c++ visual-c++ compiler-errors


【解决方案1】:

您的问题出在此处的 cpp 中。

#ifdef __ITEM_LINK
#include "ItemLink.h"

#ifdef __ITEM_LINK 表示“如果定义了__ITEM_LINK,则只处理下面的代码”

在您的情况下,它是未定义。它仅在包含"ItemLink.h" 时才被定义,而"ItemLink.h" 仅在它已定义时才被包含。你已经阻止了其中任何一个先发生。

删除#ifdef 行。

【讨论】:

  • 我也添加了 .cpp
  • 好的,谢谢,我现在就测试一下。
  • 我删除了 ifdef 行,但似乎我仍然遇到同样的错误。
  • @user2205389 请编辑您的问题以准确显示代码和错误消息现在的样子。
  • 我再次粘贴了错误,但我很确定它与旧错误相同。
【解决方案2】:

它看起来像一个链接问题。 编译器知道您的类有一个名为GetLinkedItem 的函数,但在任何地方都找不到该函数的任何定义。编译可执行文件时是否正确链接? 我敢打赌,在链接之前停止编译器不会触发任何错误。 (例如 g++ -c ItemLink.cpp)。

我要请习惯于 Visual Studio 的人帮助详细说明:D 无论如何,编译需要三个主要步骤: 1)应用预处理指令,解析源代码,查找语法错误等 2)从源代码创建一个目标文件(源代码和可执行文件之间的中间部分) 3) 将组成项目的所有目标文件链接到一个可执行文件中

您的编译链在第三步失败。 编译器希望在某些 .cpp 中定义某个函数(在编译链的第 2 步已成为目标文件),但无法在任何地方找到它。

它找不到它,因为 .cpp 文件中的 #ifdef 告诉预处理器不要包含您的定义,因为 __ITEM_LINK 没有定义

顺便说一下,我看到您更改了问题中的 .cpp

【讨论】:

  • 介意向我解释停止编译器的意思吗?我正在使用 Visual Studio 2003
  • 我在回答中详细阐述了,希望对您有所帮助
  • 好的,我会检查一下我是否错过了定义ITEM_LINK的任何地方
  • 您的问题中显示的代码应该可以编译,因为那些#ifndefs 已被删除。是吗?
  • 感谢您帮助我解决了问题:) 感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-13
  • 2016-05-29
相关资源
最近更新 更多