Статические члены класса в общей библиотеке - PullRequest
3 голосов
/ 18 июня 2009

У меня есть класс, как

class K {
  static int a;
  static int b;
}

Я хотел бы создать разделяемую библиотеку (dll), содержащую этот класс K. В cpp-файле, скомпилированном в библиотеке, я называю

int K::a = 0;
int K::b = 0;

для создания экземпляров статических переменных. DLL-библиотека компилируется без ошибок, но когда я использую библиотеку, я получаю неразрешенную внешнюю ошибку символа для членов K::a и K::b. В основной программе, где я хочу его использовать, я включаю тот же заголовок с объявлением класса K, единственное отличие состоит в том, что для библиотеки, которую я использую class __declspec( dllexport ) K { ... } , а для основной программы class K { ... }

Вероятно, я делаю более одной ошибки, поэтому мои вопросы будут, как я могу

  • сказать компоновщику, чтобы он разделял класс статического члена в библиотеке?
  • использовать статические члены класса, созданные в библиотеке в основной программе?

PS. Я использую Visual Studio 2008 ...

Ответы [ 2 ]

1 голос
/ 18 июня 2009

Нужно использовать __declspec( dllimport ) в заголовке основного приложения.

Итак, вот решение. Заголовочный файл (включенный в библиотеку и основное приложение):

#ifdef COMPILE_DLL
#define DLL_SPEC __declspec( dllexport )
#else
#define DLL_SPEC __declspec( dllimport )
#endif

class DLL_SPEC K {
   static int a;
   static int b;
}

Файл cpp в библиотеке содержит:

int K::a = 0;
int K::b = 0;

Чтобы скомпилировать библиотеку, необходимо определить макрос COMPILE_DLL, для основного приложения его не следует определять.

0 голосов
/ 18 июня 2009

Связывайте библиотеку статически, а не динамически.

Или добавьте глобальную функцию в DLL, которая возвращает значения.

...