Статические члены класса в общей библиотеке
-
06-07-2019 - |
Вопрос
У меня есть такой класс, как
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, которая возвращает значения.