共享库中的静态类成员

时间:2009-06-18 18:55:56

标签: c++ visual-studio dll shared-libraries unresolved-external

我有一个像

这样的课程
class K {
  static int a;
  static int b;
}

我想创建一个包含此类K的共享库(dll)。在库中编译的cpp文件中,我调用了

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

实例化静态变量。 dll编译时没有错误,但是当我使用库时,我得到了成员K::aK::b的未解决的外部符号错误。在我想要使用它的主程序中,我在类K的声明中包含相同的标题,唯一的区别是我使用 class __declspec( dllexport ) K { ... } 的库和主程序{{ 1}}

可能我犯了不止一个错误,所以我的问题是,我怎么能

  • 告诉链接器共享库中的静态成员类?
  • 使用在主程序库中实例化的静态类成员吗?

PS。我使用Visual Studio 2008 ...

2 个答案:

答案 0 :(得分:1)

应该在主应用程序的标题中使用__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,对于主应用程序,不应定义它。

答案 1 :(得分:0)

静态链接库而不是动态链接。

或者在DLL中添加一个返回值的全局函数。