1. ホーム
  2. C++

C++プロジェクトのコンパイル時に再定義の多重定義問題を解決する

2022-02-11 21:40:17

取得元:http://www.cppblog.com/baye/archive/2007/11/11/36398.html


<スパン C++プロジェクトのコンパイル時に、関数や変数の再定義が多く、quot;multiple definition of"が表示される。
グローバル変数をすべてglobal.hに書いて、他のすべてのファイルがそれをインクルードしているので、......の定義が複数存在するのです。
<スパン (コンパイラ gcc ) 
問題の本質は、関数の宣言と定義が同じファイルに書かれており、それが複数のファイルに含まれているため、関数の再定義が発生していることである

解決策 関数宣言と定義ファイルを分離し、関数宣言のあるファイルのみをインクルードする。

私のコードの構造
main.cpp
#include "global.h"
WinMain(....)
{ <未定義
<スパン ...
}
ファイル_1.cpp
#include "global.h"
<スパン ....
ファイル_2.cpp
#include "global.h"
<スパン ...
プロジェクト内の各ファイルは独立して解釈されるため
(たとえヘッダーファイルが
#ifndef _x_h 
<スパン ....
#enfif )
global.hが他のファイルに含まれている場合、個別に解釈され、各ファイルごとに識別子が生成されます。コンパイラが結合する際に、プロジェクト内のすべてのシンボルを統合してしまい、ファイル内の変数がリネームされているため、重複定義エラーとなります。
<スパン 以下はその解決策です。
global.c (または .cpp) で変数を宣言し、ヘッダーファイル global.h を作成し、すべての変数宣言の前に extern ... を付けます。
例:extern HANDLE ghEvent。
ここで変数の初期化文がないように注意してください。
次に、グローバル変数を使用する必要がある他の cpp ファイルに、.cpp ファイルの代わりに .h ファイルをインクルードします。コンパイラはglobal.cppのターゲットファイルを生成し、リンク時にグローバル変数を使用するファイル内でそれにリンクします。
<スパン 問題解決