时间:2010-11-03 20:08:55

标签: c++ windows dll static

我有一个C ++ windows应用程序,它由几个DLL组成。 我想要某种类型的池,我将从中获取对象,但是以某种方式来说这个池 将在所有DLL中提供 所以我把它放在一个“公共”的dll中,任何人都可以访问并在头文件中定义它,如下所示:
static Pool globalPool;

我确实可以从每个dll访问,但是这个池创建了很多次 我认为它发生在我的每个DLL和每个文件中,包括带有定义的头文件。

我该怎么做呢? 谢谢:))

3 个答案:

答案 0 :(得分:2)

对象的static声明使对象成为编译单元的本地对象。

通过使用static,您将在包含标题的每个编译单元中创建一个globalPool对象(变量)。

但是,做你想做的事情的方法不仅仅是删除static

而是定义一个提供对池的访问权限的函数(例如对它的引用),并从池DLL中导出该函数或一组函数。

或更好 - 更多更好 - 忘记这个想法。这通常是个糟糕的主意。但是,如果你真的想这样做,并且看不到任何替代方案,那么上面是如何做到的。

如果你这样做,也许可以考虑线程安全。

或许要注意,动态加载Windows DLL并不适用于编译器对线程局部变量的支持。

干杯&第h。,

答案 1 :(得分:1)

在头文件中,您需要

extern Pool globalPool;

然后在Common dll中的.cpp文件中,您需要

Pool globalPool;

extern声明将把它放在包含模块的命名空间中,链接器会将它解析为公共dll中的对象。

答案 2 :(得分:0)

你需要一个看起来像这样的头文件:

// Common.h

#pragma once

#ifdef COMMON_BUILD
// When building Common.dll, want to export the definition of Pool
#define COMMON_EXPORT __declspec(dllexport)
#else
// When using Common.dll, want to import the definition of Pool
#define COMMON_EXPORT __declspec(dllimport)
#endif

// Declarations of shared globals
struct COMMON_EXPORT Pool {
    static int data1;
    static int data2;
};

(有关dllimportdllexport内容的详情,请参阅http://msdn.microsoft.com/en-us/library/3y1sfaz2.aspxhttp://msdn.microsoft.com/en-us/library/81h27t8c.aspx

然后在你的DLL构建中,你需要一个像这样的源文件:

// Common.cpp

#define COMMON_BUILD
#include "Common.h"

int Pool::data1 = 0;
int Pool::data2 = 0;

然后,使用它的所有DLL和EXE都应"#include Common.h"并与Common DLL链接,然后它们可以使用Pool::data1等。