0

共通ヘッダー ファイルにグローバル変数があります。例えば

commonHeader.h

int commonInt = 0;

私はそれを使用したい3つのdllプロジェクトを持っているので、上記のヘッダーを含めますが、エラーシンボルが複数回定義され、#pragma onceも機能しませんでした。

上記の変数 extern を作成し、それを exe で定義すると、dll でリンカー エラーが発生します。

すべての私のdllはヘッダーの上に必要です。私のdllの1つは他の2つのdllのヘッダーファイルを必要とします(おそらくsymbolの複数のインクルードを作成します)

上記の問題を解決するにはどうすればよいですか。dll と exe で 1 つの変数のみが必要です。

Windows 7でVS 2010 profを使用しています。

前もって感謝します。

4

2 に答える 2

3

ヘッダー ファイルにそのグローバル変数定義を含めることで、One Definition Rule (§ 3.2) に違反しています。代わりに、ヘッダーファイルでのみ宣言しextern、単一の実装ファイルで定義するのは正しかったです。

__declspec(dllexport)ただし、これを dll で動作させるには、exe によってエクスポートされ、およびを使用して dll によってインポートされると宣言する必要があります。適切なマクロを使用して、exe をコンパイルするか dll をコンパイルするかに応じて__declspec(dllimport)、適切なマクロを選択します。__declspec

于 2013-01-07T13:48:08.820 に答える
3

グローバルはヘッダーでのみ宣言する必要があります。これらは、実装 (ソース) ファイルで定義する必要があります。

ヘッダーには次のものが必要です。

// commonHeader.h

extern int commonInt;    // global *declaration*

そして、実装ファイルの1つに次のものが必要です。

// some_file.cpp

int commonInt = 0;       // global *definition* (and initialisation)

もちろん、合理的に可能な限りグローバル変数は避けるべきです。

于 2013-01-07T13:46:40.093 に答える