0

これは私がずっと得ていたエラーであり、それを修正する方法を見つけようとしてきましたが、失敗しました。誰かが私を正しい方向に向けることができるかどうか尋ねています。

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

2 に答える 2

3

あなたの問題はここのcppにあります。

#ifdef __ITEM_LINK
#include "ItemLink.h"

#ifdef __ITEM_LINK__ITEM_LINK「が定義されている場合にのみ、以下のコードを処理する」ことを意味します

そしてあなたの場合、それは定義されていません"ItemLink.h"が含まれている場合にのみ定義され、"ItemLink.h"既に定義されている場合にのみ含まれます。どちらかが最初に発生するのを防ぎました。

行を削除し#ifdefます。

于 2013-03-28T20:13:36.597 に答える
0

リンクの問題のようです。コンパイラは、クラスに呼び出された関数GetLinkedItemがあることを認識していますが、その関数の定義がどこにも見つかりません。実行可能ファイルをコンパイルするときに適切にリンクしていますか? リンクする前にコンパイラを停止してもエラーは発生しません。(例: g++ -c ItemLink.cpp)。

Visual Studio に慣れている人の助けを借りて、さらに詳しく説明してもらいます :D とにかく、コンパイルには 3 つの主要な手順が必要です: 1) プリプロセッサ ディレクティブの適用、ソース コードの解析、構文エラーの検索など 2) ファイルの作成ソース コードからのオブジェクト ファイル (ソース コードと実行可能ファイルの中間にあるもの) 3) プロジェクトを構成するすべてのオブジェクト ファイルを 1 つの実行可能ファイルにリンクする

コンパイル チェーンは 3 番目のステップで失敗します。コンパイラは、特定の関数が一部の .cpp (コンパイル チェーンのステップ 2 でオブジェクト ファイルになっている) で定義されていることを期待していますが、どこにも見つかりません。

__ITEM_LINK が定義されていないため、定義を含めないようにプリプロセッサに指示する .cpp ファイルの #ifdef が原因で、それを見つけることができません。

ちなみに、質問の .cpp を変更したようです

于 2013-03-28T20:23:10.497 に答える