链接到多个项目时的多个全局数据实例

时间:2012-09-27 13:30:00

标签: c++ linker extern

我有一个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中,因此输出是单个可执行文件。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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