3

我有一个像

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

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

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

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

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

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

PS。我使用 Visual Studio 2008...

4

2 回答 2

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,对于主应用程序,它不应该被定义。

于 2009-06-18T19:50:32.443 回答
0

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

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

于 2009-06-18T19:12:52.880 回答