共享库中的静态类成员

Static class members in shared library

提问人:balint.miklos 提问时间:6/19/2009 最后编辑:rtnbalint.miklos 更新时间:6/19/2009 访问量:2562

问:

我有一个这样的班级

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

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

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

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

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

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

我使用Visual Studio 2008...

C++ Visual-Studio DLL 共享库 未解析的外部

评论


答:

0赞 Kieveli 6/19/2009 #1

以静态方式而不是动态方式链接图书馆。

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

1赞 balint.miklos 6/19/2009 #2

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