3

我有一个 Visual C++ 解决方案,它由 3 个项目组成。

其中一个项目,项目“A”被其他两个项目使用,它有一些应该始终相同的全局数据。

但是,当我将项目 A 链接到其他两个项目时,似乎项目 A 的两个实例正在处理不同的数据。

可能是这种情况吗?如何设置链接过程以防止这种情况发生?

--- 更新让事情更清楚

- Project 1 -

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

- Project 2 -

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

- Project A -

int data;

init() {
  data = 123;
}

get_data() {
  return data;
}

正如您在这个例子中看到的那样,我正在第一个项目中初始化项目 A 的数据,并从第二个项目中访问它。我的观察是,当第二个项目的访问发生时,数据没有初始化。

项目 A 和 2 都静态链接到项目 1,因此输出是单个可执行文件。

4

2 回答 2

2

全局驻留在进程内存空间中的单个位置。如果您有两个共享一个模块的进程,它们每个都有单独的变量,是的。

您需要使用 IPC 在进程之间共享数据。

于 2012-09-27T13:32:17.597 回答
0

静态库中项目 A 的符号分别链接到项目 1 和项目 2。将它们合并涉及特定于编译器的机制。

基本上,您必须让项目 2 重新导出项目 A 的符号,并让项目 1 导入这些符号,而不是直接导入项目 A。

如果您不能这样做(例如,因为您无法控制项目 1 或项目 2),则必须在项目 A 中编写解决方法。一种选择(通常最简单)是将项目 A 转换为动态库。然后项目 1 和 2 都加载项目 A 的同一个实例并共享数据。

另一种选择是更改项目 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 回答