1. ホーム
  2. c++

[解決済み】1つ以上の多重定義されたシンボルが見つかる

2022-01-25 02:07:40

質問内容

DebugUtil.h

#ifndef DEBUG_UTIL_H
#define DEBUG_UTIL_H

#include <windows.h>

int DebugMessage(const char* message)
{
    const int MAX_CHARS = 1023;
    static char s_buffer[MAX_CHARS+1];

    return 0;
}

#endif

これを実行しようとすると、こんなエラーが出ます。

Terrain.obj : error LNK2005: "int __cdecl DebugMessage(char const *)" (?DebugMessage@@YAHPBD@Z) はすでに Loodus.obj で定義されています。

Renderer.obj : エラー LNK2005: "int __cdecl DebugMessage(char const *)" (?DebugMessage@@YAHPBD@Z) 既に公開されています。 Loodus.obj で定義されています。

test.obj : エラー LNK2005: "int __cdecl DebugMessage(char const *)" (?DebugMessage@YAHPBD@Z) はすでに Loodus.obj で定義されています。

C:\UsersTiago³³Desktop³³Loodus EngineDebug Loodus Engine.exe : fatal エラー LNK1169: 1つまたは複数のマルチプル 定義されたシンボルが見つかりました

しかし、なぜこのようなことが起こるのでしょうか?ヘッダーに#ifndef #define と#endifを記述しているので、多重定義は起きないはずなのですが...。

どうすればいいですか?

cppファイルに定義(本体)を置き、hファイルには宣言だけを残す。インクルードガードは、1つの翻訳単位(ソースファイル)内だけで動作し、プログラム全体では動作しません。

C++規格の1定義ルールでは、プログラム内で使用される非インライン関数の定義は、それぞれ正確に1つでなければならないとされています。ですから、別の方法として、関数をインライン化することができます。