Вопрос

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

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...

Это было полезно?

Решение

Следует использовать __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, для основного приложения он не должен быть определен.

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top