C++プロジェクトのコンパイル時に再定義の多重定義問題を解決する
取得元: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のターゲットファイルを生成し、リンク時にグローバル変数を使用するファイル内でそれにリンクします。
<スパン
問題解決
関連
-
の 0x091f11c7 での未処理例外について。0xC0000005: アクセス違反の読み取り位置 0x0ab0f
-
std::logic_error' のインスタンスを投げた後に呼び出された実行エラー終了 what(): basic_string::_S_const
-
C++ std::string は NULL で初期化できない、基本的な使い方
-
C++ JSON ライブラリ jsoncpp 新 API の使用法 (CharReaderBuilder / StreamWriterBuilder)
-
警告:組み込み関数 'malloc' の互換性のない暗黙の宣言を修正する方法
-
const char*' から 'char*' への変換が無効です。
-
const char*' から `char*' への変換が無効な場合の対処法
-
munmap_chunk():不正なポインタとSegmentation faultのバグを解決。
-
エラー: "" から非スカラー型 "" への変換
-
c++は、ダブルフリーまたは破損(fasttop)が表示されます。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
戦闘機ゲームのC++実装(ソースコード)
-
C++がpythonを呼び出す
-
C/C++共通エラーの概要
-
C++のostreamの詳細な使用方法
-
vs2015 はソースファイル stdio.h を見つけることができない 解決策
-
エラー: ローカル変数 'res' に関連付けられたスタックメモリのアドレスが返された
-
ソースファイルをコンパイルするとDev C++のランタイムエラーが発生し、コンパイルできない
-
c++ experience summary(1):linux c compile with warning: assign makes pointer from integer without cast reason.
-
c++ 11 random ライブラリの簡単な使い方
-
ランタイムエラー: 'std::logic_error' のインスタンスを投げた後に terminate が呼び出されました。