Переменная во всем приложении - PullRequest
1 голос
/ 03 ноября 2010

У меня есть приложение на C ++ для Windows, которое состоит из нескольких библиотек DLL. Я хочу иметь какой-то пул, из которого я получу объекты, но таким образом, что этот пул будет доступен во всех DLL.
Поэтому я поместил его в «Common» dll, к которому у всех есть доступ, и определил его в заголовочном файле так:
статический пул globalPool;

У меня есть доступ из каждой библиотеки DLL, но этот пул создается много раз.
Я думаю, что это происходит в каждой из моих библиотек DLL и в каждом файле, которые включают файл заголовка с определением.

Как я могу сделать это правильно? спасибо:)

Ответы [ 3 ]

2 голосов
/ 03 ноября 2010

Объявление static объекта делает объект локальным для единицы компиляции.

Используя static, вы создаете globalPool объект (переменную) в каждой единице компиляции, в которую вы включаетезаголовок.

Но способ сделать то, что вы хотите, это не просто удалить static.

Вместо определения функции, обеспечивающей доступ к вашему пулу (например, ссылку на него),и экспортируйте эту функцию или набор функций из DLL пула.

Или лучше - намного лучше - забудьте об этой идее.Это вообще плохая идея.Однако, если вы действительно хотите это сделать и не видите никакой другой альтернативы, то выше описано, как это сделать.

И если вы это сделаете, возможно, подумайте о безопасности потоков.

И, возможно, следует помнить, что динамическая загрузка Windows DLL не работает с поддержкой компилятором локальных переменных потоков.

Cheers & hth.,

1 голос
/ 03 ноября 2010

В заголовочном файле вам нужно

extern Pool globalPool;

Тогда в .cpp файле в Common dll вам нужно

Pool globalPool;

Объявление extern поместит его в пространство имен включаемых модулей, а компоновщик разрешит его для объекта в общей dll.

0 голосов
/ 03 ноября 2010

Вам потребуется заголовочный файл, который выглядит примерно так:

// 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;
};

(Подробнее о dllimport и dllexport см. http://msdn.microsoft.com/en-us/library/3y1sfaz2.aspx и http://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 и т. д.

...