2013-03-28 3 views
0

Это ошибка, которую я получаю все время, и я пытался выяснить, как ее исправить, но не удалось. Я спрашиваю, может ли кто-нибудь указать мне правильное направление.Почему я получаю эту ошибку? «неразрешенный внешний символ»

WorldServer fatal error LNK1120: 2 unresolved externals 
WorldServer error LNK2019: unresolved external symbol "public: class CItemElem * __thiscall CLinkedItemMgr::GetLinkedItem(unsigned long)" ([email protected]@@[email protected]@[email protected]) referenced in function "private: void __thiscall CDPSrvr::OnLinkedItem(class CAr &,unsigned long,unsigned long,unsigned char *,unsigned long)" ([email protected]@@[email protected]@[email protected]) 
WorldServer error LNK2019: unresolved external symbol "public: int __thiscall CLinkedItemMgr::AddLinkedItem(class CItemElem *)" ([email protected]@@[email protected]@@Z) referenced in function "private: void __thiscall CDPSrvr::OnLinkedItem(class CAr &,unsigned long,unsigned long,unsigned char *,unsigned long)" ([email protected]@@[email protected]@[email protected]) 

Это .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

Где вы определяете 'AddLinkedItem'? –

+3

Ваши охранники включают зарезервированные идентификаторы: http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-ac-identifier – chris

ответ

3

Ваша проблема в CPP здесь.

#ifdef __ITEM_LINK 
#include "ItemLink.h" 

#ifdef __ITEM_LINK означает «обрабатывать только код ниже, если __ITEM_LINK определяется»

И в вашем случае, это не определен. Он определяется только тогда, когда включен "ItemLink.h", и "ItemLink.h" включен, если он уже определен. Вы не позволили себе это сделать.

Удалить линию #ifdef.

+0

Я добавил .cpp как хорошо – user2205389

+0

хорошо, спасибо, я проверю его прямо сейчас. – user2205389

+0

Я удалил строку ifdef, но, похоже, я все еще получаю ту же ошибку. – user2205389

0

Это похоже на проблему с привязкой. Компилятор знает, что ваш класс имеет функцию, называемую GetLinkedItem, но не может найти никакого определения этой функции в любом месте. Правильно ли вы привязываетесь при компиляции своего исполняемого файла? Держу пари, что останавливать компилятор перед связыванием не вызывает никаких ошибок. (например, g ++ -c ItemLink.cpp).

я буду просить помощи у кого-то, кто привык к визуальной студии разработать более: D в любом случае, компилирование необходимо три основных этапа: 1) применение директив препроцессора, синтаксические анализ исходного кода, ищет синтаксические ошибки и подобные 2) создание объектного файла из исходного кода (что-то на полпути между исходным кодом и исполняемый файл) 3), связывающую все объектные файлы, составляющие ваш проект в одном исполняемом

ваша компилирование цепь терпит неудачу на третьем этапе , компилятор ожидает, что определенная функция будет определена в некотором .cpp (который стал объектным файлом на этапе 2 компиляции цепочки), но не может найти его нигде.

и он не может найти его из-за этого #ifdef в файле .cpp, который говорит препроцессор не включать свои определения, так как __ITEM_LINK не определен

я вижу, что вы изменили .cpp в вашем вопрос кстати

+0

Помните, что я имею в виду, что вы имеете в виду, остановив компилятор? Я использую Visual Studio 2003 – user2205389

+0

, я подробно изложил в своем ответе, надеюсь, что вы сочтете это полезным – blue

+0

Хорошо, я проверю, не пропал ли я где-нибудь при определении ITEM_LINK – user2205389

Смежные вопросы