代码之家  ›  专栏  ›  技术社区  ›  Zach

C++静态库中的共享全局变量

  •  5
  • Zach  · 技术社区  · 14 年前

    我有一个MSC++项目(我们称之为Project A),我现在正在编译为静态库(.LIB)。它定义了一个全局变量foo。我还有另外两个分别编译的项目(分别称为B和C),每个项目都链接A中的共享静态库。B和C都是在同一进程中加载的dll。我想在同一个过程中在B和C之间共享一个来自a的foo实例:singleton。我不确定如何用项目A实现这里的单例模式,因为它是分别静态编译到B和C中的。如果我在B和C中都将foo声明为extern,那么在B和C中会得到不同的实例。使用带有静态getInstance方法的标准、简单的单例类模式会导致两个静态foo实例化。

    当项目A被静态编译成B和C时,有什么方法可以实现这一点吗?或者我必须做一个动态链接库?

    3 回复  |  直到 14 年前
        1
  •  4
  •   Jeremy Bell    14 年前

    是的,您必须创建一个共享的DLL,或者在B和C中将其定义为extern,并静态链接这三个DLL。

        2
  •  2
  •   Ragster    14 年前

    不-它们不是共享的。

    从李希特的“Windows通过C/C++”(P583:)

    当一个进程映射一个DLL映像文件时 在其地址空间中 系统创建全局

    因此,如果需要在多个可执行文件之间共享资源,则需要创建某种类型的共享内核对象。我建议您创建一个命名文件映射,然后您可以使用该映射从单独的进程中读取和写入(当然,使用适当的互斥排除)

        3
  •  0
  •   user7098596    8 年前

    我实际遇到了这个问题:

    我有C.DLL也与B.LIB链接。

    如您所见,这两个程序是用B.LIB链接的

    加载后,A.EXE和C.DLL分别为代码和数据分隔了B.LIB

    与A.EXE和C.DLL共享存储在B.LIB中的全局/静态数据的解决方案是使用共享类/接口。A.EXE将接口发送到C.DLL,并使用指向A.EXE中存储的B.LIB的数据/接口指针。

    在所有情况下,由于A.EXE和C.DLL中的B.LIB的代码重复,存储在C.DLL中的B.LIB会继续膨胀全局程序

    为了减少全局膨胀,您必须将A.LIB划分为更多的D.DLL、E.DLL,这些D.DLL由A.EXE加载并通过接口传输到C.DLL

    要将臃肿的代码减少到零,必须使用完全独立的接口方法。