1. ホーム
  2. c++

[解決済み] エラー lnk2005 は .obj で既に定義されています。

2022-02-18 07:06:35

質問

このエラーについては、多くの質問があります。しかし、それらはたった一つの変数にしか関連していません。

test.h

namespace World
{
    enum Objects
    {
        TERRAIN = 1,
        BOX = 2,
        SPHERE = 4,
        CAPSULE = 8

    };  

    void WorldObjects2(unsigned int mask)
    {
      .......
    }
}

void test();

test.cpp

#include "test.h"

void test()
{
    .......
}

main.cpp

#include "test.h"
int main()
{
    test();
    return 0;
}

Visual stduio 2013でこれらのコードを実行すると、エラーが発生します。それは次のように言います。 error LNK2005: "void __cdecl World::WorldObjects2(unsigned int)" (?WorldObjects2@World@@YAXI@Z) already defined in main.obj . どうすればこのエラーを修正できますか?

解決方法は?

プロジェクトには2つの関数が定義されています。 WorldObjects2 : 1つはコンパイル単位である test.cpp であり、もう一方はコンパイル単位である main.cpp なぜなら、この関数が定義されているヘッダは、この二つの cpp ファイルに含まれているからです。

関数指定子を使用するか inline

inline void WorldObjects2(unsigned int mask)
{
    .......
}

あるいは、関数定義を cpp ファイルに移動して、ヘッダに関数宣言 (定義なし) だけを残します。

もう一つの方法は、関数を内部リンクがあるものとして作成することです。例えば、キーワードstaticを追加することができます。

static void WorldObjects2(unsigned int mask)
{
    .......
}

または、与えられた名前空間の中の無名の名前空間に関数を配置することができます。

namespace World
{
    // ...
    namespace
    {
        void WorldObjects2(unsigned int mask)
        {
            .......
        }
    }  
}