3

3 つのプロジェクトで構成される Visual C++ ソリューションがあります。

これらのプロジェクトの 1 つであるプロジェクト「A」は、他の両方のプロジェクトで使用されており、常に同じであるはずのグローバル データが含まれています。

ただし、プロジェクト A を他の両方のプロジェクトにリンクすると、プロジェクト A の 2 つのインスタンスが異なるデータで作業しているように見えます。

これは事実であり、これが起こらないようにリンクプロセスを設定するにはどうすればよいですか?

--- より明確にするための更新

- Project 1 -

main () {
  init();
  test();
}

- Project 2 -

test () {
  cout << get_data();
}

- Project A -

int data;

init() {
  data = 123;
}

get_data() {
  return data;
}

この例でわかるように、最初のプロジェクトでプロジェクト A のデータを初期化し、2 番目のプロジェクトからアクセスしています。私の観察では、2 番目のプロジェクトからのアクセスが行われたときにデータが初期化されていません。

プロジェクト A と 2 の両方がプロジェクト 1 に静的にリンクされているため、出力は単一の実行可能ファイルになります。

4

2 に答える 2

2

グローバルは、プロセスのメモリ空間内の 1 つの場所に存在します。モジュールを共有する 2 つのプロセスがある場合、それぞれに個別の変数があります。

プロセス間でデータを共有するには、IPC を使用する必要があります。

于 2012-09-27T13:32:17.597 に答える
0

スタティック ライブラリのプロジェクト A のシンボルは、プロジェクト 1 とプロジェクト 2 の両方に別々にリンクされます。それらをマージするには、コンパイラ固有のメカニズムが必要です。

基本的には、プロジェクト A を直接インポートする代わりに、プロジェクト 2 にプロジェクト A のシンボルを再エクスポートさせ、プロジェクト 1 にそれらをインポートさせる必要があります。

それができない場合 (たとえば、プロジェクト 1 または 2 を制御できないため)、プロジェクト A 内に回避策を記述する必要があります。1 つのオプション (通常最も簡単な方法) は、プロジェクト A を動的ライブラリに変換することです。次に、プロジェクト 1 と 2 の両方がプロジェクト A の同じインスタンスを読み込み、データが共有されます。

もう 1 つのオプションは、グローバル変数を持たないようにプロジェクト A を変更することですが、代わりに、必要なデータを含むプロセス グローバル データ項目を登録します。たとえば、ローカル アトム テーブル [1] を悪用して、動的メモリへのポインターを格納できます。

[1] http://msdn.microsoft.com/en-us/library/windows/desktop/ms649053%28v=vs.85%29.aspx#_win32_Integer_Atoms

于 2012-09-27T14:31:12.803 に答える